示例#1
0
        void OnMessageNetworkObjectList(byte[] data, ulong steamID)
        {
            MessageNetworkObjectList messageNetworkObjectList = MessageNetworkObjectList.FromBytes(data, 0);

            foreach (byte[] b in messageNetworkObjectList.messages)
            {
                UpdateNetworkObject(MessageNetworkObject.FromBytes(b, 0));
            }
        }
示例#2
0
        private void SendAllNetworkObjects(bool onlySendChangedTransforms, SendType sendType)
        {
            // Save all network object messages that need to be sended into one pool
            // Sort the pool by the depth of the transform in the hierarchy
            // This makes sure that parents are instantiated before their children
            List <KeyValuePair <int, NetworkObject> > networkObjectsToSend = new List <KeyValuePair <int, NetworkObject> >();

            foreach (NetworkObject networkObject in networkObjects.Values)
            {
                if (!onlySendChangedTransforms || networkObject.HasChanged())
                {
                    KeyValuePair <int, NetworkObject> networkObjectToAdd = new KeyValuePair <int, NetworkObject>(GetHierarchyDepthOfTransform(networkObject.transform, 0), networkObject);
                    networkObjectsToSend.Add(networkObjectToAdd);
                }
            }

            // Sort by the depth of the transform
            networkObjectsToSend.Sort
            (
                delegate(KeyValuePair <int, NetworkObject> a, KeyValuePair <int, NetworkObject> b)
            {
                return(a.Key - b.Key);
            }
            );

            // Standard is UDP packet size, 1200 bytes
            int maximumTransmissionLength = 1200;

            if (sendType == SendType.Reliable)
            {
                // TCP packet, up to 1MB
                maximumTransmissionLength = 1000000;
            }

            // Create and send network object list messages until the pool is empty
            while (networkObjectsToSend.Count > 0)
            {
                // Make sure that the message is small enough to fit into the UDP packet (1200 bytes)
                MessageNetworkObjectList messageNetworkObjectList = new MessageNetworkObjectList();

                while (true)
                {
                    if (networkObjectsToSend.Count > 0)
                    {
                        // Add next message
                        MessageNetworkObject message = new MessageNetworkObject(networkObjectsToSend[0].Value);
                        messageNetworkObjectList.messages.AddLast(message.ToBytes());

                        // Check if length is still small enough
                        if (messageNetworkObjectList.GetLength() <= maximumTransmissionLength)
                        {
                            // Small enough, keep message and remove from objects to send
                            networkObjectsToSend.RemoveAt(0);
                        }
                        else
                        {
                            // Too big, remove message and create a new list to send the rest
                            messageNetworkObjectList.messages.RemoveLast();
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }

                // Send the message to all clients
                NetworkManager.Instance.SendToAllClients(messageNetworkObjectList.ToBytes(), NetworkMessageType.NetworkObjectList, sendType);
            }
        }