using FishNet.Documenting; using FishNet.Serializing.Helping; using FishNet.Utility.Constant; using System.Runtime.CompilerServices; using UnityEngine; [assembly: InternalsVisibleTo(UtilityConstants.CODEGEN_ASSEMBLY_NAME)] namespace FishNet.Object { /// /// Scripts which inherit from NetworkBehaviour can be used to gain insight of, and perform actions on the network. /// public abstract partial class NetworkBehaviour : MonoBehaviour { /// /// True if this NetworkBehaviour is initialized for the network. /// public bool IsSpawned => _networkObjectCache.IsSpawned; /// /// /// [SerializeField, HideInInspector] private byte _componentIndexCache = byte.MaxValue; /// /// ComponentIndex for this NetworkBehaviour. /// public byte ComponentIndex { get => _componentIndexCache; private set => _componentIndexCache = value; } #if UNITY_EDITOR /// /// NetworkObject automatically added or discovered during edit time. /// [SerializeField, HideInInspector] private NetworkObject _addedNetworkObject; #endif /// /// /// [SerializeField, HideInInspector] private NetworkObject _networkObjectCache; /// /// NetworkObject this behaviour is for. /// public NetworkObject NetworkObject => _networkObjectCache; /// /// Initializes this script. This will only run once even as host. /// /// /// internal void InitializeOnceInternal() { InitializeOnceSyncTypes(); InitializeOnceRpcLinks(); } /// /// Serializes information for network components. /// internal void SerializeComponents(NetworkObject nob, byte componentIndex) { _networkObjectCache = nob; ComponentIndex = componentIndex; } /// /// Manually initializes network content for the NetworkBehaviour if the object it's on is disabled. /// internal void InitializeIfDisabled() { if (gameObject.activeInHierarchy) return; NetworkInitializeIfDisabledInternal(); } /// /// Long name is to prevent users from potentially creating their own method named the same. /// [CodegenMakePublic] //internal. [APIExclude] protected internal virtual void NetworkInitializeIfDisabledInternal() { } #region Editor. protected virtual void Reset() { #if UNITY_EDITOR if (Application.isPlaying) return; //NetworkObject nob = TryAddNetworkObject(); TryAddNetworkObject(); //nob.UpdateNetworkBehaviours(); #endif } protected virtual void OnValidate() { #if UNITY_EDITOR if (Application.isPlaying) return; TryAddNetworkObject(); //NetworkObject nob = TryAddNetworkObject(); ////If componentIndex has not been set. //if (ComponentIndex == byte.MaxValue) // nob.UpdateNetworkBehaviours(); #endif } /// /// Tries to add the NetworkObject component. /// private NetworkObject TryAddNetworkObject() { #if UNITY_EDITOR if (Application.isPlaying || _addedNetworkObject != null) return _addedNetworkObject; /* Manually iterate up the chain because GetComponentInParent doesn't * work when modifying prefabs in the inspector. Unity, you're starting * to suck a lot right now. */ NetworkObject result = null; Transform climb = transform; while (climb != null) { if (climb.TryGetComponent(out result)) break; else climb = climb.parent; } _addedNetworkObject = (result != null) ? result : transform.root.gameObject.AddComponent(); return _addedNetworkObject; #else return null; #endif } #endregion } }