/// <summary> /// Removes serialized object from memory. /// </summary> public static void RemoveSerializedObjectFromMemory(short objectIdentity) { if (QNetManager.IsHostActive) // if host is active, we will ignore this one { return; } if (WorldIsSerialized) { var qNetObject = QNetObjectBehaviour.GetSpawnedObject(objectIdentity) ?? QNetObjectBehaviour.GetPredefinedObject(objectIdentity); if (qNetObject == null) { JEMLogger.LogError( $"System was trying to destroy de-serialized object but target of identity {objectIdentity} not exists in current world."); } else { InternalDestroySerializedObject(qNetObject); } } else { var serializedObject = default(QNetWorldSerializerObject); for (var index = 0; index < InternalSerializedObjectsInMemory.Count; index++) { if (InternalSerializedObjectsInMemory[index].Object.ObjectIdentity == objectIdentity) { serializedObject = InternalSerializedObjectsInMemory[index]; break; } } if (serializedObject.Equals(default(QNetWorldSerializerObject))) { JEMLogger.LogWarning( $"System was trying to remove object from world serializer memory but target of identity {objectIdentity} not exist."); } else { InternalSerializedObjectsInMemory.Remove(serializedObject); } } }
private static IEnumerator InternalFromSerializedObject(QNetWorldSerializerObject obj, Action onDone) { var predefined = QNetObjectBehaviour.GetPredefinedObject(obj.Object.ObjectIdentity); if (predefined != null) { if (predefined.Prefab != null && predefined.Prefab.PrefabIdentity != obj.Object.PrefabIdentity) { JEMLogger.LogError("Local predefined object does not have the same prefab identity as server."); } // update predefined object transform predefined.transform.position = obj.Object.Position; predefined.transform.rotation = obj.Object.Rotation; // identity predefined.UpdateIdentity(predefined.ObjectIdentity, obj.Object.OwnerIdentity); // call network methods predefined.OnInternalSpawned(); predefined.OnNetworkActive(); // scale? predefined.transform.localScale = obj.Object.Scale; // de-serialize server state predefined.DeSerializeServerState(obj.SerializedServerState); // activate predefined object predefined.gameObject.SetActive(true); yield return(predefined); // manual recycling QNetManager.Client.OriginalClient.Recycle(obj.SerializedServerState.GetMessage()); onDone.Invoke(); yield break; } var prefab = QNetManager.Database.GetPrefab(obj.Object.PrefabIdentity); if (prefab == null) { JEMLogger.Log( $"World serializer is trying to create object but prefab of given id not exists in database. ({obj.Object.PrefabIdentity})"); // manual recycling QNetManager.Client.OriginalClient.Recycle(obj.SerializedServerState.GetMessage()); onDone.Invoke(); yield break; } // create local instance of received var behaviour = QNetObjectBehaviour.InternalSpawn(obj.Object.ObjectIdentity, prefab, obj.Object.Position, obj.Object.Rotation, obj.Object.OwnerIdentity); yield return(behaviour); if (behaviour != null) { // scale? behaviour.transform.localScale = obj.Object.Scale; // de-serialize server state behaviour.DeSerializeServerState(obj.SerializedServerState); // add created object to local array. InternalSerializedAndInstancedObjects.Add(behaviour); } // ignore, if system fail to spawn new object (most likely because of duplicate) // manual recycling QNetManager.Client.OriginalClient.Recycle(obj.SerializedServerState.GetMessage()); onDone.Invoke(); }