internal void OnStartServer(bool allowNonZeroNetId) { if (m_IsServer) { return; } m_IsServer = true; m_HasAuthority = !m_LocalPlayerAuthority; m_Observers = new Dictionary <int, NetworkConnection>(); CacheBehaviours(); // If the instance/net ID is invalid here then this is an object instantiated from a prefab and the server should assign a valid ID if (netId == 0) { m_NetId = GetNextNetworkId(); } else { if (!allowNonZeroNetId) { if (LogFilter.logError) { Debug.LogError("Object has non-zero netId " + netId + " for " + gameObject); } return; } } if (LogFilter.logDev) { Debug.Log("OnStartServer " + gameObject + " GUID:" + netId); } NetworkServer.SetLocalObjectOnServer(netId, gameObject); for (int i = 0; i < m_NetworkBehaviours.Length; i++) { NetworkBehaviour comp = m_NetworkBehaviours[i]; try { comp.OnStartServer(); } catch (Exception e) { Debug.LogError("Exception in OnStartServer:" + e.Message + " " + e.StackTrace); } } if (NetworkClient.active && NetworkServer.localClientActive) { // there will be no spawn message, so start the client here too ClientScene.SetLocalObject(netId, gameObject); OnStartClient(); } if (m_HasAuthority) { OnStartAuthority(); } }
static void DestroyObject(NetworkIdentity uv, bool destroyServerObject) { if (LogFilter.Debug) { Debug.Log("DestroyObject instance:" + uv.netId); } if (objects.ContainsKey(uv.netId)) { objects.Remove(uv.netId); } if (uv.clientAuthorityOwner != null) { uv.clientAuthorityOwner.RemoveOwnedObject(uv); } ObjectDestroyMessage msg = new ObjectDestroyMessage(); msg.netId = uv.netId; SendToObservers(uv.gameObject, (short)MsgType.ObjectDestroy, msg); uv.ClearObservers(); if (NetworkClient.active && s_LocalClientActive) { uv.OnNetworkDestroy(); ClientScene.SetLocalObject(msg.netId, null); } // when unspawning, dont destroy the server's object if (destroyServerObject) { UnityEngine.Object.Destroy(uv.gameObject); } uv.MarkForReset(); }
// Called by the server to set the LocalClient's LocalPlayer object during NetworkServer.AddPlayer() internal void AddLocalPlayer(NetworkIdentity localPlayer) { if (LogFilter.logDev) { Debug.Log("Local client AddLocalPlayer " + localPlayer.gameObject.name + " conn=" + m_Connection.connectionId); } m_Connection.isReady = true; m_Connection.SetPlayerController(localPlayer); NetworkIdentity uv = localPlayer; if (uv != null) { ClientScene.SetLocalObject(uv.netId, localPlayer.gameObject); uv.SetConnectionToServer(m_Connection); } // there is no SystemOwnerMessage for local client. add to ClientScene here instead ClientScene.InternalAddPlayer(uv); }
internal static void ActivateLocalClientScene() { if (s_LocalClientActive) { return; } // ClientScene for a local connection is becoming active. any spawned objects need to be started as client objects s_LocalClientActive = true; foreach (var uv in objects.Values) { if (!uv.isClient) { if (LogFilter.Debug) { Debug.Log("ActivateClientScene " + uv.netId + " " + uv.gameObject); } ClientScene.SetLocalObject(uv.netId, uv.gameObject); uv.OnStartClient(); } } }