Pun-01/Assets/Photon/PhotonUnityNetworking/Code/Interfaces/IPunCallbacks.cs
2022-07-08 09:14:55 +08:00

141 lines
7.0 KiB
C#

namespace Photon.Pun
{
using UnityEngine;
using Photon.Realtime;
/// <summary>Defines the OnPhotonSerializeView method to make it easy to implement correctly for observable scripts.</summary>
/// \ingroup callbacks
public interface IPunObservable
{
/// <summary>
/// Called by PUN several times per second, so that your script can write and read synchronization data for the PhotonView.
/// </summary>
/// <remarks>
/// This method will be called in scripts that are assigned as Observed component of a PhotonView.<br/>
/// PhotonNetwork.SerializationRate affects how often this method is called.<br/>
/// PhotonNetwork.SendRate affects how often packages are sent by this client.<br/>
///
/// Implementing this method, you can customize which data a PhotonView regularly synchronizes.
/// Your code defines what is being sent (content) and how your data is used by receiving clients.
///
/// Unlike other callbacks, <i>OnPhotonSerializeView only gets called when it is assigned
/// to a PhotonView</i> as PhotonView.observed script.
///
/// To make use of this method, the PhotonStream is essential. It will be in "writing" mode" on the
/// client that controls a PhotonView (PhotonStream.IsWriting == true) and in "reading mode" on the
/// remote clients that just receive that the controlling client sends.
///
/// If you skip writing any value into the stream, PUN will skip the update. Used carefully, this can
/// conserve bandwidth and messages (which have a limit per room/second).
///
/// Note that OnPhotonSerializeView is not called on remote clients when the sender does not send
/// any update. This can't be used as "x-times per second Update()".
/// </remarks>
/// \ingroup publicApi
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info);
}
/// <summary>
/// Global Callback interface for ownership changes. These callbacks will fire for changes to ANY PhotonView that changes.
/// Consider using IOnPhotonViewControllerChange for callbacks from a specific PhotonView.
/// </summary>
public interface IPunOwnershipCallbacks
{
/// <summary>
/// Called when another player requests ownership of a PhotonView.
/// Called on all clients, so check if (targetView.IsMine) or (targetView.Owner == PhotonNetwork.LocalPlayer)
/// to determine if a targetView.TransferOwnership(requestingPlayer) response should be given.
/// </summary>
/// <remarks>
/// The parameter viewAndPlayer contains:
///
/// PhotonView view = viewAndPlayer[0] as PhotonView;
///
/// Player requestingPlayer = viewAndPlayer[1] as Player;
/// </remarks>
/// <param name="targetView">PhotonView for which ownership gets requested.</param>
/// <param name="requestingPlayer">Player who requests ownership.</param>
void OnOwnershipRequest(PhotonView targetView, Player requestingPlayer);
/// <summary>
/// Called when ownership of a PhotonView is transfered to another player.
/// </summary>
/// <remarks>
/// The parameter viewAndPlayers contains:
///
/// PhotonView view = viewAndPlayers[0] as PhotonView;
///
/// Player newOwner = viewAndPlayers[1] as Player;
///
/// Player oldOwner = viewAndPlayers[2] as Player;
/// </remarks>
/// <example>void OnOwnershipTransfered(object[] viewAndPlayers) {} //</example>
/// <param name="targetView">PhotonView for which ownership changed.</param>
/// <param name="previousOwner">Player who was the previous owner (or null, if none).</param>
void OnOwnershipTransfered(PhotonView targetView, Player previousOwner);
/// <summary>
/// Called when an Ownership Request fails for objects with "takeover" setting.
/// </summary>
/// <remarks>
/// Each request asks to take ownership from a specific controlling player. This can fail if anyone
/// else took over ownership briefly before the request arrived.
/// </remarks>
/// <param name="targetView"></param>
/// <param name="senderOfFailedRequest"></param>
void OnOwnershipTransferFailed(PhotonView targetView, Player senderOfFailedRequest);
}
/// \ingroup callbacks
public interface IPunInstantiateMagicCallback
{
void OnPhotonInstantiate(PhotonMessageInfo info);
}
/// <summary>
/// Defines an interface for object pooling, used in PhotonNetwork.Instantiate and PhotonNetwork.Destroy.
/// </summary>
/// <remarks>
/// To apply your custom IPunPrefabPool, set PhotonNetwork.PrefabPool.
///
/// The pool has to return a valid, disabled GameObject when PUN calls Instantiate.
/// Also, the position and rotation must be applied.
///
/// Note that Awake and Start are only called once by Unity, so scripts on re-used GameObjects
/// should make use of OnEnable and or OnDisable. When OnEnable gets called, the PhotonView
/// is already updated to the new values.
///
/// To be able to enable a GameObject, Instantiate must return an inactive object.
///
/// Before PUN "destroys" GameObjects, it will disable them.
///
/// If a component implements IPunInstantiateMagicCallback, PUN will call OnPhotonInstantiate
/// when the networked object gets instantiated. If no components implement this on a prefab,
/// PUN will optimize the instantiation and no longer looks up IPunInstantiateMagicCallback
/// via GetComponents.
/// </remarks>
public interface IPunPrefabPool
{
/// <summary>
/// Called to get an instance of a prefab. Must return valid, disabled GameObject with PhotonView.
/// </summary>
/// <param name="prefabId">The id of this prefab.</param>
/// <param name="position">The position for the instance.</param>
/// <param name="rotation">The rotation for the instance.</param>
/// <returns>A disabled instance to use by PUN or null if the prefabId is unknown.</returns>
GameObject Instantiate(string prefabId, Vector3 position, Quaternion rotation);
/// <summary>
/// Called to destroy (or just return) the instance of a prefab. It's disabled and the pool may reset and cache it for later use in Instantiate.
/// </summary>
/// <remarks>
/// A pool needs some way to find out which type of GameObject got returned via Destroy().
/// It could be a tag, name, a component or anything similar.
/// </remarks>
/// <param name="gameObject">The instance to destroy.</param>
void Destroy(GameObject gameObject);
}
}