Exemple #1
0
        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);
            }
        }