184 lines
6.6 KiB
C#
184 lines
6.6 KiB
C#
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
using FishNet.CodeAnalysis.Annotations;
|
|||
|
#endif
|
|||
|
using FishNet.Connection;
|
|||
|
using FishNet.Documenting;
|
|||
|
using FishNet.Object.Synchronizing.Internal;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace FishNet.Object
|
|||
|
{
|
|||
|
|
|||
|
public abstract partial class NetworkBehaviour : MonoBehaviour
|
|||
|
{
|
|||
|
#region Public.
|
|||
|
/// <summary>
|
|||
|
/// True if OnStartServer has been called.
|
|||
|
/// </summary>
|
|||
|
[APIExclude]
|
|||
|
public bool OnStartServerCalled { get; private set; }
|
|||
|
/// <summary>
|
|||
|
/// True if OnStartClient has been called.
|
|||
|
/// </summary>
|
|||
|
[APIExclude]
|
|||
|
public bool OnStartClientCalled { get; private set; }
|
|||
|
#endregion
|
|||
|
|
|||
|
#region Private.
|
|||
|
/// <summary>
|
|||
|
/// True if OnStartNetwork has been called.
|
|||
|
/// </summary>
|
|||
|
private bool _onStartNetworkCalled;
|
|||
|
/// <summary>
|
|||
|
/// True if OnStopNetwork has been called.
|
|||
|
/// </summary>
|
|||
|
private bool _onStopNetworkCalled;
|
|||
|
#endregion
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Invokes cached callbacks on SyncTypes which were held until OnStartXXXXX was called.
|
|||
|
/// </summary>
|
|||
|
/// <param name="asServer"></param>
|
|||
|
internal void InvokeSyncTypeCallbacks(bool asServer)
|
|||
|
{
|
|||
|
foreach (SyncBase item in _syncVars.Values)
|
|||
|
item.OnStartCallback(asServer);
|
|||
|
foreach (SyncBase item in _syncObjects.Values)
|
|||
|
item.OnStartCallback(asServer);
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Invokes the OnStart/StopNetwork.
|
|||
|
/// </summary>
|
|||
|
/// <param name="start"></param>
|
|||
|
internal void InvokeOnNetwork(bool start)
|
|||
|
{
|
|||
|
if (start)
|
|||
|
{
|
|||
|
if (_onStartNetworkCalled)
|
|||
|
return;
|
|||
|
OnStartNetwork();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (_onStopNetworkCalled)
|
|||
|
return;
|
|||
|
OnStopNetwork();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Called when the network has initialized this object. May be called for server or client but will only be called once.
|
|||
|
/// When as host or server this method will run before OnStartServer.
|
|||
|
/// When as client only the method will run before OnStartClient.
|
|||
|
/// </summary>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnStartNetwork()
|
|||
|
{
|
|||
|
_onStartNetworkCalled = true;
|
|||
|
_onStopNetworkCalled = false;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Called when the network is deinitializing this object. May be called for server or client but will only be called once.
|
|||
|
/// When as host or server this method will run after OnStopServer.
|
|||
|
/// When as client only this method will run after OnStopClient.
|
|||
|
/// </summary>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnStopNetwork()
|
|||
|
{
|
|||
|
_onStopNetworkCalled = true;
|
|||
|
_onStartNetworkCalled = false;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Called on the server after initializing this object.
|
|||
|
/// SyncTypes modified before or during this method will be sent to clients in the spawn message.
|
|||
|
/// </summary>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnStartServer()
|
|||
|
{
|
|||
|
OnStartServerCalled = true;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Called on the server before deinitializing this object.
|
|||
|
/// </summary>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnStopServer()
|
|||
|
{
|
|||
|
OnStartServerCalled = false;
|
|||
|
ReturnRpcLinks();
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Called on the server after ownership has changed.
|
|||
|
/// </summary>
|
|||
|
/// <param name="prevOwner">Previous owner of this object.</param>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnOwnershipServer(NetworkConnection prevOwner)
|
|||
|
{
|
|||
|
//When switching ownership always clear replicate cache on server.
|
|||
|
ClearReplicateCache_Internal(true);
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Called on the server after a spawn message for this object has been sent to clients.
|
|||
|
/// Useful for sending remote calls or data to clients.
|
|||
|
/// </summary>
|
|||
|
/// <param name="connection">Connection the object is being spawned for.</param>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnSpawnServer(NetworkConnection connection) { }
|
|||
|
/// <summary>
|
|||
|
/// Called on the server before a despawn message for this object has been sent to connection.
|
|||
|
/// Useful for sending remote calls or actions to clients.
|
|||
|
/// </summary>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnDespawnServer(NetworkConnection connection) { }
|
|||
|
/// <summary>
|
|||
|
/// Called on the client after initializing this object.
|
|||
|
/// </summary>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnStartClient()
|
|||
|
{
|
|||
|
OnStartClientCalled = true;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Called on the client before deinitializing this object.
|
|||
|
/// </summary>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnStopClient()
|
|||
|
{
|
|||
|
OnStartClientCalled = false;
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// Called on the client after gaining or losing ownership.
|
|||
|
/// </summary>
|
|||
|
/// <param name="prevOwner">Previous owner of this object.</param>
|
|||
|
#if UNITY_2020_3_OR_NEWER && UNITY_EDITOR_WIN
|
|||
|
[OverrideMustCallBase(BaseCallMustBeFirstStatement = true)]
|
|||
|
#endif
|
|||
|
public virtual void OnOwnershipClient(NetworkConnection prevOwner)
|
|||
|
{
|
|||
|
//If losing or gaining ownership then clear replicate cache.
|
|||
|
if (IsOwner || prevOwner == LocalConnection)
|
|||
|
ClearReplicateCache_Internal(false);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|