public void RebuildObservers(bool initialize) { if (m_Observers == null) { return; } bool changed = false; bool result = false; HashSet <NetworkConnection> newObservers = new HashSet <NetworkConnection>(); HashSet <NetworkConnection> oldObservers = new HashSet <NetworkConnection>(m_Observers.Values); for (int i = 0; i < m_NetworkBehaviours.Length; i++) { NetworkBehaviour comp = m_NetworkBehaviours[i]; result |= comp.OnRebuildObservers(newObservers, initialize); } if (!result) { // none of the behaviours rebuilt our observers, use built-in rebuild method if (initialize) { foreach (KeyValuePair <int, NetworkConnection> kvp in NetworkServer.connections) { NetworkConnection conn = kvp.Value; if (conn.isReady) { AddObserver(conn); } } if (NetworkServer.localConnection != null && NetworkServer.localConnection.isReady) { AddObserver(NetworkServer.localConnection); } } return; } // apply changes from rebuild foreach (var conn in newObservers) { if (conn == null) { continue; } if (!conn.isReady) { if (LogFilter.logWarn) { Debug.LogWarning("Observer is not ready for " + gameObject + " " + conn); } continue; } if (initialize || !oldObservers.Contains(conn)) { // new observer conn.AddToVisList(this); if (LogFilter.logDebug) { Debug.Log("New Observer for " + gameObject + " " + conn); } changed = true; } } foreach (var conn in oldObservers) { if (!newObservers.Contains(conn)) { // removed observer conn.RemoveFromVisList(this, false); if (LogFilter.logDebug) { Debug.Log("Removed Observer for " + gameObject + " " + conn); } changed = true; } } // special case for local client. if (initialize) { if (!newObservers.Contains(NetworkServer.localConnection)) { OnSetLocalVisibility(false); } } if (changed) { m_Observers = newObservers.ToDictionary(conn => conn.connectionId, conn => conn); } }