internal static void SendSpawnMessage(NetworkIdentity identity, NetworkConnection conn) { if (identity.serverOnly) return; if (LogFilter.Debug) Debug.Log("Server SendSpawnMessage: name=" + identity.name + " sceneId=" + identity.sceneId.ToString("X") + " netid=" + identity.netId); // for easier debugging // 'identity' is a prefab that should be spawned if (identity.sceneId == 0) { SpawnPrefabMessage msg = new SpawnPrefabMessage { netId = identity.netId, assetId = identity.assetId, position = identity.transform.position, rotation = identity.transform.rotation, scale = identity.transform.localScale, // serialize all components with initialState = true payload = identity.OnSerializeAllSafely(true) }; // conn is != null when spawning it for a client if (conn != null) { conn.Send(msg); } // conn is == null when spawning it for the local player else { SendToReady(identity, msg); } } // 'identity' is a scene object that should be spawned again else { SpawnSceneObjectMessage msg = new SpawnSceneObjectMessage { netId = identity.netId, sceneId = identity.sceneId, position = identity.transform.position, rotation = identity.transform.rotation, scale = identity.transform.localScale, // include synch data payload = identity.OnSerializeAllSafely(true) }; // conn is != null when spawning it for a client if (conn != null) { conn.Send(msg); } // conn is == null when spawning it for the local player else { SendToReady(identity, msg); } } }
internal static void SendSpawnMessage(NetworkIdentity identity, NetworkConnection conn) { if (identity.serverOnly) { return; } if (LogFilter.Debug) { Debug.Log("Server SendSpawnMessage: name=" + identity.name + " sceneId=" + identity.sceneId + " netid=" + identity.netId); } // for easier debugging // 'identity' is a prefab that should be spawned if (identity.sceneId == 0) { SpawnPrefabMessage msg = new SpawnPrefabMessage(); msg.netId = identity.netId; msg.assetId = identity.assetId; msg.position = identity.transform.position; msg.rotation = identity.transform.rotation; // serialize all components with initialState = true msg.payload = identity.OnSerializeAllSafely(true); // conn is != null when spawning it for a client if (conn != null) { conn.Send((short)MsgType.SpawnPrefab, msg); } // conn is == null when spawning it for the local player else { SendToReady(identity.gameObject, (short)MsgType.SpawnPrefab, msg); } } // 'identity' is a scene object that should be spawned again else { SpawnSceneObjectMessage msg = new SpawnSceneObjectMessage(); msg.netId = identity.netId; msg.sceneId = identity.sceneId; msg.position = identity.transform.position; // note: no msg.rotation here because client&server both start with same scene (=same scene object rotations) // include synch data msg.payload = identity.OnSerializeAllSafely(true); // conn is != null when spawning it for a client if (conn != null) { conn.Send((short)MsgType.SpawnSceneObject, msg); } // conn is == null when spawning it for the local player else { SendToReady(identity.gameObject, (short)MsgType.SpawnSceneObject, msg); } } }
public void OnSerializeAllSafely() { // create a networkidentity with our test components SerializeTest1NetworkBehaviour comp1 = gameObject.AddComponent <SerializeTest1NetworkBehaviour>(); SerializeExceptionNetworkBehaviour compExc = gameObject.AddComponent <SerializeExceptionNetworkBehaviour>(); SerializeTest2NetworkBehaviour comp2 = gameObject.AddComponent <SerializeTest2NetworkBehaviour>(); // set some unique values to serialize comp1.value = 12345; comp1.syncMode = SyncMode.Observers; compExc.syncMode = SyncMode.Observers; comp2.value = "67890"; comp2.syncMode = SyncMode.Owner; // serialize all var ownerWriter = new NetworkWriter(); var observersWriter = new NetworkWriter(); // serialize should propagate exceptions Assert.Throws <Exception>(() => { identity.OnSerializeAllSafely(true, ownerWriter, observersWriter); }); }
internal void SendSpawnMessage(NetworkIdentity identity, NetworkConnection conn) { if (identity.serverOnly) { return; } // for easier debugging if (LogFilter.Debug) { Debug.Log("Server SendSpawnMessage: name=" + identity.name + " sceneId=" + identity.sceneId.ToString("X") + " netid=" + identity.NetId); } // one writer for owner, one for observers using (PooledNetworkWriter ownerWriter = NetworkWriterPool.GetWriter(), observersWriter = NetworkWriterPool.GetWriter()) { // serialize all components with initialState = true // (can be null if has none) (int ownerWritten, int observersWritten) = identity.OnSerializeAllSafely(true, ownerWriter, observersWriter); // convert to ArraySegment to avoid reader allocations // (need to handle null case too) ArraySegment <byte> ownerSegment = ownerWritten > 0 ? ownerWriter.ToArraySegment() : default; ArraySegment <byte> observersSegment = observersWritten > 0 ? observersWriter.ToArraySegment() : default; var msg = new SpawnMessage { netId = identity.NetId, isLocalPlayer = conn.Identity == identity, isOwner = identity.ConnectionToClient == conn, sceneId = identity.sceneId, assetId = identity.AssetId, // use local values for VR support position = identity.transform.localPosition, rotation = identity.transform.localRotation, scale = identity.transform.localScale }; // use owner segment if 'conn' owns this identity, otherwise // use observers segment msg.payload = msg.isOwner ? ownerSegment : observersSegment; conn.Send(msg); } }
internal static void SendSpawnMessage(NetworkIdentity uv, NetworkConnection conn) { if (uv.serverOnly) { return; } if (LogFilter.Debug) { Debug.Log("Server SendSpawnMessage: name=" + uv.name + " sceneId=" + uv.sceneId + " netid=" + uv.netId); } // for easier debugging // 'uv' is a prefab that should be spawned if (uv.sceneId == 0) { SpawnPrefabMessage msg = new SpawnPrefabMessage(); msg.netId = uv.netId; msg.assetId = uv.assetId; msg.position = uv.transform.position; msg.rotation = uv.transform.rotation; // serialize all components with initialState = true NetworkWriter writer = new NetworkWriter(); uv.OnSerializeAllSafely(writer, true); msg.payload = writer.ToArray(); // conn is != null when spawning it for a client if (conn != null) { conn.Send((short)MsgType.SpawnPrefab, msg); } // conn is == null when spawning it for the local player else { SendToReady(uv.gameObject, (short)MsgType.SpawnPrefab, msg); } } // 'uv' is a scene object that should be spawned again else { SpawnSceneObjectMessage msg = new SpawnSceneObjectMessage(); msg.netId = uv.netId; msg.sceneId = uv.sceneId; msg.position = uv.transform.position; // include synch data NetworkWriter writer = new NetworkWriter(); uv.OnSerializeAllSafely(writer, true); msg.payload = writer.ToArray(); // conn is != null when spawning it for a client if (conn != null) { conn.Send((short)MsgType.SpawnSceneObject, msg); } // conn is == null when spawning it for the local player else { SendToReady(uv.gameObject, (short)MsgType.SpawnSceneObject, msg); } } }
internal static void SendSpawnMessage(NetworkIdentity identity, NetworkConnection conn) { if (identity.serverOnly) { return; } if (LogFilter.Debug) { Debug.Log("Server SendSpawnMessage: name=" + identity.name + " sceneId=" + identity.sceneId.ToString("X") + " netid=" + identity.netId); // for easier debugging } // serialize all components with initialState = true // (can be null if has none) // convert to ArraySegment to avoid reader allocations // (need to handle null case too) ArraySegment <byte> segment = identity.OnSerializeAllSafely(true, out NetworkWriter serialized) ? serialized.ToArraySegment() : default; // 'identity' is a prefab that should be spawned if (identity.sceneId == 0) { SpawnPrefabMessage msg = new SpawnPrefabMessage { netId = identity.netId, owner = conn?.playerController == identity, assetId = identity.assetId, // use local values for VR support position = identity.transform.localPosition, rotation = identity.transform.localRotation, scale = identity.transform.localScale, payload = segment }; // conn is != null when spawning it for a client if (conn != null) { conn.Send(msg); } // conn is == null when spawning it for the local player else { SendToReady(identity, msg); } } // 'identity' is a scene object that should be spawned again else { SpawnSceneObjectMessage msg = new SpawnSceneObjectMessage { netId = identity.netId, owner = conn?.playerController == identity, sceneId = identity.sceneId, // use local values for VR support position = identity.transform.localPosition, rotation = identity.transform.localRotation, scale = identity.transform.localScale, payload = segment }; // conn is != null when spawning it for a client if (conn != null) { conn.Send(msg); } // conn is == null when spawning it for the local player else { SendToReady(identity, msg); } } if (serialized != null) { NetworkWriterPool.Recycle(serialized); } }