コード例 #1
0
        /// <summary>
        ///     Writes new serialized object in to memory.
        /// </summary>
        public static void WriteSerializedObjectToMemory(QNetWorldSerializerObject obj)
        {
            if (QNetManager.IsHostActive) // if host is active, we will ignore this one
            {
                return;
            }

            if (WorldIsSerialized)
            {
                Instance.StartCoroutine(InternalFromSerializedObject(obj, () => { }));
            }
            else
            {
                InternalSerializedObjectsInMemory.Add(obj);
            }
        }
コード例 #2
0
        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();
        }