public void OnDeserializeSafelyShouldDetectAndHandleDeSerializationMismatch() { // add components SerializeTest1NetworkBehaviour comp1 = gameObject.AddComponent <SerializeTest1NetworkBehaviour>(); gameObject.AddComponent <SerializeMismatchNetworkBehaviour>(); SerializeTest2NetworkBehaviour comp2 = gameObject.AddComponent <SerializeTest2NetworkBehaviour>(); // set some unique values to serialize comp1.value = 12345; comp2.value = "67890"; // serialize var ownerWriter = new NetworkWriter(); var observersWriter = new NetworkWriter(); identity.OnSerializeAllSafely(true, ownerWriter, observersWriter); // reset component values comp1.value = 0; comp2.value = null; // deserialize all var reader = new NetworkReader(ownerWriter.ToArray()); Assert.Throws <InvalidMessageException>(() => { identity.OnDeserializeAllSafely(reader, true); }); }
void ApplySpawnPayload(NetworkIdentity identity, SpawnMessage msg) { identity.Reset(); if (msg.assetId != Guid.Empty) { identity.AssetId = msg.assetId; } if (!identity.gameObject.activeSelf) { identity.gameObject.SetActive(true); } // apply local values for VR support identity.transform.localPosition = msg.position; identity.transform.localRotation = msg.rotation; identity.transform.localScale = msg.scale; identity.HasAuthority = msg.isOwner; identity.NetId = msg.netId; identity.Server = hostServer; identity.Client = this; if (msg.isLocalPlayer) { InternalAddPlayer(identity); } // deserialize components if any payload // (Count is 0 if there were no components) if (msg.payload.Count > 0) { using (PooledNetworkReader payloadReader = NetworkReaderPool.GetReader(msg.payload)) { identity.OnDeserializeAllSafely(payloadReader, true); } } Spawned[msg.netId] = identity; // objects spawned as part of initial state are started on a second pass if (isSpawnFinished) { identity.NotifyAuthority(); identity.StartClient(); CheckForLocalPlayer(identity); } }