// -------------------------------------------------------------------------------------------------------------------- // // Part of: Photon Unity Utilities // // A compact script for prototyping. // developer@exitgames.com // -------------------------------------------------------------------------------------------------------------------- namespace Photon.Pun.UtilityScripts { using System.Collections; using UnityEngine; using UnityEngine.EventSystems; /// /// Destroys the networked GameObject either by PhotonNetwork.Destroy or by sending an RPC which calls Object.Destroy(). /// /// /// Using an RPC to Destroy a GameObject is typically a bad idea. /// It allows any player to Destroy a GameObject and may cause errors. /// /// A client has to clean up the server's event-cache, which contains events for Instantiate and /// buffered RPCs related to the GO. /// /// A buffered RPC gets cleaned up when the sending player leaves the room, so players joining later /// won't get those buffered RPCs. This in turn, may mean they don't destroy the GO due to coming later. /// /// Vice versa, a GameObject Instantiate might get cleaned up when the creating player leaves a room. /// This way, the GameObject that a RPC targets might become lost. /// /// It makes sense to test those cases. Many are not breaking errors and you just have to be aware of them. /// /// /// Gets OnClick() calls by Unity's IPointerClickHandler. Needs a PhysicsRaycaster on the camera. /// See: https://docs.unity3d.com/ScriptReference/EventSystems.IPointerClickHandler.html /// public class OnClickDestroy : MonoBehaviourPun, IPointerClickHandler { public PointerEventData.InputButton Button; public KeyCode ModifierKey; public bool DestroyByRpc; void IPointerClickHandler.OnPointerClick(PointerEventData eventData) { if (!PhotonNetwork.InRoom || (this.ModifierKey != KeyCode.None && !Input.GetKey(this.ModifierKey)) || eventData.button != this.Button ) { return; } if (this.DestroyByRpc) { this.photonView.RPC("DestroyRpc", RpcTarget.AllBuffered); } else { PhotonNetwork.Destroy(this.gameObject); } } [PunRPC] public IEnumerator DestroyRpc() { Destroy(this.gameObject); yield return 0; // if you allow 1 frame to pass, the object's OnDestroy() method gets called and cleans up references. } } }