/// <summary>
        /// 这个可以调用的messageReceived事件调用的包装器
        /// A wrapper for the messageReceived event call that chindren of this can call
        /// </summary>
        protected void OnBinaryMessageReceived(NetworkingPlayer player, Binary frame)
        {
            byte routerId = frame.RouterId;

            if (routerId == RouterIds.RPC_ROUTER_ID || routerId == RouterIds.BINARY_DATA_ROUTER_ID || routerId == RouterIds.CREATED_OBJECT_ROUTER_ID)
            {
                uint          id           = frame.StreamData.GetBasicType <uint>();
                NetworkObject targetObject = null;

                lock (NetworkObjectDict)
                {
                    NetworkObjectDict.TryGetValue(id, out targetObject);
                }

                if (targetObject == null)
                {
                    // 收到该网络对象的消息包
                    // 但是该玩家机器上还没有创建网络对象
                    // 就将该消息缓存器来,等待网络对象创建完再掉用
                    lock (missingObjectBuffer)
                    {
                        if (!missingObjectBuffer.ContainsKey(id))
                        {
                            missingObjectBuffer.Add(id, new List <Action <NetworkObject> >());
                        }

                        missingObjectBuffer[id].Add((networkObject) =>
                        {
                            ExecuteRouterAction(routerId, networkObject, (Binary)frame, player);
                        });
                    }

                    // TODO:  If the server is missing an object, it should have a timed buffer
                    // that way useless messages are not setting around in memory
                    // TODO:如果服务器缺少一个对象,它应该有一个定时缓冲区
                    //这种无用的消息不会在内存中设置

                    return;
                }

                ExecuteRouterAction(routerId, targetObject, (Binary)frame, player);
            }
            // 创建网络对象
            else if (routerId == RouterIds.NETWORK_OBJECT_ROUTER_ID)
            {
                CreateNetworkObject(player, (Binary)frame);
            }
            // 在服务器接受客户端时,将服务器现有的所有网络对象 发给该玩家,让他创建
            else if (routerId == RouterIds.ACCEPT_MULTI_ROUTER_ID)
            {
                CreateMultiNetworkObject(player, (Binary)frame);
            }
        }
        /// <summary>
        /// 网络对象注册完成
        /// </summary>
        /// <param name="networkObject">网络对象</param>
        public void CompleteInitialization(NetworkObject networkObject)
        {
            lock (NetworkObjectDict)
            {
                if (NetworkObjectDict.ContainsKey(networkObject.NetworkId))
                {
                    return;
                }

                NetworkObjectDict.Add(networkObject.NetworkId, networkObject);
                NetworkObjectList.Add(networkObject);
            }
        }
        /// <summary>
        ///注册一个网络对象与这个网络, 如果forceId是0,会分配一个ID
        /// </ summary>
        /// <param name =“networkObject”>要使用此联网器注册的对象</ param>
        /// <returns> <c> true </ c>如果对象已经成功注册,否则<c> false </ c>已注册</ returns>
        public bool RegisterNetworkObject(NetworkObject networkObject, uint forceId = 0)
        {
            uint id = currentNetworkObjectId;

            lock (NetworkObjectDict)
            {
                // If we are forcing this object
                if (forceId != 0)
                {
                    if (NetworkObjectDict.ContainsKey(forceId))
                    {
                        return(false);
                    }

                    id = forceId;

                    if (!networkObject.RegisterOnce(id))
                    {
                        throw new BaseNetworkException("The supplied network object has already been assigned to a networker and has an id");
                    }

                    //AddNetworkObject(forceId, networkObject);
                    //NetworkObjectList.Add(networkObject);
                }
                else
                {
                    do
                    {
                        if (NetworkObjectDict.ContainsKey(++currentNetworkObjectId))
                        {
                            continue;
                        }

                        if (!networkObject.RegisterOnce(currentNetworkObjectId))
                        {
                            //返回,因为下次调用这个方法会在检查之前增加
                            // Backtrack since the next call to this method will increment before checking
                            currentNetworkObjectId--;

                            throw new BaseNetworkException("The supplied network object has already been assigned to a networker and has an id");
                        }

                        //AddNetworkObject(currentNetworkObjectId, networkObject);
                        //NetworkObjectList.Add(networkObject);
                        break;
                    } while (IsBound);
                }
            }

            //将网络ID分配给网络对象
            // Assign the network id to the network object
            networkObject.RegisterOnce(id);

            // When this object is destroyed it needs to remove itself from the list
            networkObject.onDestroy += (RoomScene sender) =>
            {
                lock (NetworkObjectDict)
                {
                    NetworkObjectDict.Remove(networkObject.NetworkId);
                    NetworkObjectList.Remove(networkObject);
                }
            };

            return(true);
        }