void OnMessageNetworkObjectList(byte[] data, ulong steamID) { MessageNetworkObjectList messageNetworkObjectList = MessageNetworkObjectList.FromBytes(data, 0); foreach (byte[] b in messageNetworkObjectList.messages) { UpdateNetworkObject(MessageNetworkObject.FromBytes(b, 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); } }