Exemplo n.º 1
0
        public void HybridComponentSerialize()
        {
            var root   = CreateGameObject();
            var values = new[] { 123, 234, 345 };

            foreach (var value in values)
            {
                var gameObject = CreateGameObject().ParentTo(root);
                gameObject.AddComponent <EcsTestMonoBehaviourComponent>().SomeValue = value;
            }

            GameObjectConversionUtility.ConvertGameObjectHierarchy(root, MakeDefaultSettings().WithExtraSystem <ConversionHybridTests.MonoBehaviourComponentConversionSystem>());

            ReferencedUnityObjects objRefs = null;
            var writer = new TestBinaryWriter();

            SerializeUtilityHybrid.Serialize(m_Manager, writer, out objRefs);

            var world = new World("temp");

            var reader = new TestBinaryReader(writer);

            SerializeUtilityHybrid.Deserialize(world.EntityManager, reader, objRefs);

            var query      = world.EntityManager.CreateEntityQuery(typeof(EcsTestMonoBehaviourComponent));
            var components = query.ToComponentArray <EcsTestMonoBehaviourComponent>();

            CollectionAssert.AreEquivalent(components.Select(c => c.SomeValue), values);

            query.Dispose();
            world.Dispose();
            reader.Dispose();
        }
 public static void Query(ReferencedUnityObjects referencedUnityObjects)
 {
     for (int i = 0; i < referencedUnityObjects.Array.Length; i++)
     {
         Debug.Log(i + " " + referencedUnityObjects.Array[i].name + " " + referencedUnityObjects.Array[i].GetType());
     }
 }
Exemplo n.º 3
0
        public static void Deserialize(EntityManager manager, BinaryReader reader, ReferencedUnityObjects objRefs)
        {
            DeserializeObjectReferences(manager, objRefs, "", out var objectReferences);
            var transaction = manager.BeginExclusiveEntityTransaction();

            SerializeUtility.DeserializeWorld(transaction, reader, objectReferences);
            manager.EndExclusiveEntityTransaction();
        }
Exemplo n.º 4
0
    static void LoadHybrid(EntityManager entityManager, ReferencedUnityObjects objectTable)
    {
        string filePath = Application.persistentDataPath + "/testHyb.bin";

        using (var binaryReader = new StreamBinaryReader(filePath))
        {
            //ExclusiveEntityTransaction transaction = entityManager.BeginExclusiveEntityTransaction();

            SerializeUtilityHybrid.Deserialize(entityManager, binaryReader, objectTable);

            //entityManager.EndExclusiveEntityTransaction();
        }
    }
Exemplo n.º 5
0
    static void SaveHybrid(EntityManager entityManager, out ReferencedUnityObjects objectTable)
    {
        string filePath = Application.persistentDataPath + "/testHyb.bin";

        if (File.Exists(filePath))
        {
            File.Delete(filePath);
        }

        using (var binaryWriter = new StreamBinaryWriter(filePath))
        {
            SerializeUtilityHybrid.Serialize(entityManager, binaryWriter, out objectTable);
        }
    }
Exemplo n.º 6
0
        public static void DeserializeObjectReferences(EntityManager manager, ReferencedUnityObjects objRefs, string debugSceneName, out UnityEngine.Object[] objectReferences)
        {
            objectReferences = objRefs?.Array;

            // NOTE: Object references must not include fake object references, they must be real null.
            // The Unity.Properties deserializer can't handle them correctly.
            // We might want to add support for handling fake null,
            // but it would require tight integration in the deserialize function so that a correct fake null unityengine.object can be constructed on deserialize
            if (objectReferences != null)
            {
#if !UNITY_EDITOR || USE_SUBSCENE_EDITORBUNDLES
                // When using bundles, the Companion GameObjects cannot be directly used (prefabs), so we need to instantiate everything.
                var sourceToInstance = new Dictionary <UnityEngine.GameObject, UnityEngine.GameObject>();
#endif

                for (int i = 0; i != objectReferences.Length; i++)
                {
                    if (objectReferences[i] == null)
                    {
                        objectReferences[i] = null;
                        continue;
                    }

#if !UNITY_EDITOR || USE_SUBSCENE_EDITORBUNDLES
                    if (objectReferences[i] is UnityEngine.GameObject source)
                    {
                        var instance = UnityEngine.GameObject.Instantiate(source);
                        objectReferences[i] = instance;
                        sourceToInstance.Add(source, instance);
                    }
#endif
                }

#if !UNITY_EDITOR || USE_SUBSCENE_EDITORBUNDLES
                for (int i = 0; i != objectReferences.Length; i++)
                {
                    if (objectReferences[i] is UnityEngine.Component component)
                    {
                        objectReferences[i] = sourceToInstance[component.gameObject].GetComponent(component.GetType());
                    }
                }
#endif
            }
        }
Exemplo n.º 7
0
        public static void DeserializeObjectReferences(EntityManager manager, ReferencedUnityObjects objRefs, string debugSceneName, out UnityEngine.Object[] objectReferences)
        {
            objectReferences = objRefs?.Array;

            // NOTE: Object references must not include fake object references, they must be real null.
            // The Unity.Properties deserializer can't handle them correctly.
            // We might want to add support for handling fake null,
            // but it would require tight integration in the deserialize function so that a correct fake null unityengine.object can be constructed on deserialize
            if (objectReferences != null)
            {
                for (int i = 0; i != objectReferences.Length; i++)
                {
                    if (objectReferences[i] == null)
                    {
                        objectReferences[i] = null;
                    }
                }
            }
        }
Exemplo n.º 8
0
        // https://fogbugz.unity3d.com/f/cases/1204153/
        public void SharedComponentUnityObjectSerialize_Case_1204153()
        {
            var go1    = new GameObject();
            var go2    = new GameObject();
            var shared = new SharedComponentWithUnityObject {
                obj = go1
            };
            var entity = m_Manager.CreateEntity();

            m_Manager.AddSharedComponentData(entity, shared);
            var writer = new TestBinaryWriter();

            ReferencedUnityObjects objRefs = null;

            SerializeUtilityHybrid.Serialize(m_Manager, writer, out objRefs);
            var reader = new TestBinaryReader(writer);

            // Swap the obj ref to a different instance but same value.  This can occur with any Unity.Object
            // during subscene serialize/deserialize since the editor's Unity.Object.GetHashCode() returns
            // an instance ID instead of a hash of the values in it.  There is no reasonable expectation that
            // the instance IDs would match between a serialize and deserialize.
            objRefs.Array[0] = go2;

            var world = new World("temp");

            SerializeUtilityHybrid.Deserialize(world.EntityManager, reader, objRefs);

            var newWorldEntities = world.EntityManager;
            var uniqueShared     = new List <SharedComponentWithUnityObject>();
            var query            = newWorldEntities.CreateEntityQuery(ComponentType.ReadWrite <SharedComponentWithUnityObject>());

            newWorldEntities.GetAllUniqueSharedComponentData(uniqueShared);
            Assert.AreEqual(2, uniqueShared.Count);
            query.SetSharedComponentFilter(uniqueShared[1]);
            Assert.AreEqual(1, query.CalculateEntityCount());

            query.Dispose();
            world.Dispose();
            reader.Dispose();
        }
Exemplo n.º 9
0
        static unsafe NativeList <Hash128> ReferencedUnityObjectsToGUIDs(ReferencedUnityObjects referencedUnityObjects, AssetImportContext ctx)
        {
            var globalObjectIds = new GlobalObjectId[referencedUnityObjects.Array.Length];
            var guids           = new NativeList <Hash128>(globalObjectIds.Length, Allocator.Temp);

            GlobalObjectId.GetGlobalObjectIdsSlow(referencedUnityObjects.Array, globalObjectIds);

            for (int i = 0; i != globalObjectIds.Length; i++)
            {
                var assetGUID = globalObjectIds[i].assetGUID;
                // Skip most built-ins, except for BuiltInExtra which we need to depend on
                if (GUIDHelper.IsBuiltin(assetGUID))
                {
                    if (GUIDHelper.IsBuiltinExtraResources(assetGUID))
                    {
                        var objectIdentifiers = ContentBuildInterface.GetPlayerObjectIdentifiersInAsset(assetGUID, ctx.selectedBuildTarget);

                        foreach (var objectIdentifier in objectIdentifiers)
                        {
                            var packedGUID = assetGUID;
                            GUIDHelper.PackBuiltinExtraWithFileIdent(ref packedGUID, objectIdentifier.localIdentifierInFile);

                            guids.Add(packedGUID);
                        }
                    }
                    else if (GUIDHelper.IsBuiltinResources(assetGUID))
                    {
                        guids.Add(assetGUID);
                    }
                }
                else if (!assetGUID.Empty())
                {
                    guids.Add(assetGUID);
                }
            }

            return(guids);
        }
Exemplo n.º 10
0
 public static void DeserializeObjectReferences(EntityManager manager, ReferencedUnityObjects objRefs, string debugSceneName, out UnityEngine.Object[] objectReferences)
 {
     objectReferences = objRefs?.Array;
 }
Exemplo n.º 11
0
        public void SharedComponentSerialize()
        {
            for (int i = 0; i != 20; i++)
            {
                var entity = m_Manager.CreateEntity();
                m_Manager.AddSharedComponentData(entity, new MockSharedData {
                    Value = i
                });
                m_Manager.AddComponentData(entity, new EcsTestData(i));
                var buffer = m_Manager.AddBuffer <EcsIntElement>(entity);
                foreach (var val in Enumerable.Range(i, i + 5))
                {
                    buffer.Add(new EcsIntElement {
                        Value = val
                    });
                }
            }

            var writer = new TestBinaryWriter();

            ReferencedUnityObjects objRefs = null;

            SerializeUtilityHybrid.Serialize(m_Manager, writer, out objRefs);

            var reader = new TestBinaryReader(writer);

            var world = new World("temp");

            SerializeUtilityHybrid.Deserialize(world.EntityManager, reader, objRefs);

            var newWorldEntities = world.EntityManager;

            {
                var entities = newWorldEntities.GetAllEntities();

                Assert.AreEqual(20, entities.Length);

                for (int i = 0; i != 20; i++)
                {
                    Assert.AreEqual(i, newWorldEntities.GetComponentData <EcsTestData>(entities[i]).value);
                    Assert.AreEqual(i, newWorldEntities.GetSharedComponentData <MockSharedData>(entities[i]).Value);
                    var buffer = newWorldEntities.GetBuffer <EcsIntElement>(entities[i]);
                    Assert.That(
                        buffer.AsNativeArray().ToArray(),
                        Is.EqualTo(Enumerable.Range(i, i + 5).Select(x => new EcsIntElement {
                        Value = x
                    }))
                        );
                }
                for (int i = 0; i != 20; i++)
                {
                    newWorldEntities.DestroyEntity(entities[i]);
                }

                entities.Dispose();
            }

            Assert.IsTrue(newWorldEntities.Debug.IsSharedComponentManagerEmpty());

            world.Dispose();
            reader.Dispose();
        }
Exemplo n.º 12
0
        public void ManagedComponentWithObjectReferenceSerialize()
        {
            for (int i = 0; i != 20; i++)
            {
                var e1 = m_Manager.CreateEntity();

                UnityEngine.Texture2D tex    = new UnityEngine.Texture2D(i + 1, i + 1);
                var expectedManagedComponent = new ManagedComponentWithObjectReference {
                    Texture = tex
                };

                m_Manager.AddComponentData(e1, expectedManagedComponent);
            }

            var writer = new TestBinaryWriter();
            ReferencedUnityObjects objRefs = null;

            SerializeUtilityHybrid.Serialize(m_Manager, writer, out objRefs);

            var world  = new World("temp");
            var reader = new TestBinaryReader(writer);

            SerializeUtilityHybrid.Deserialize(world.EntityManager, reader, objRefs);

            var newWorldEntities = world.EntityManager;

            {
                var entities = newWorldEntities.GetAllEntities();
                Assert.AreEqual(20, entities.Length);

                var seenWidths  = new NativeArray <bool>(entities.Length, Allocator.Temp);
                var seenHeights = new NativeArray <bool>(entities.Length, Allocator.Temp);
                for (int i = 0; i < entities.Length; ++i)
                {
                    var e = entities[i];

                    var actualManagedComponent = newWorldEntities.GetComponentData <ManagedComponentWithObjectReference>(e);
                    Assert.NotNull(actualManagedComponent);
                    var tex = actualManagedComponent.Texture;
                    seenWidths[tex.width - 1]   = true;
                    seenHeights[tex.height - 1] = true;
                }

                for (int i = 0; i < entities.Length; ++i)
                {
                    Assert.IsTrue(seenWidths[i]);
                    Assert.IsTrue(seenHeights[i]);
                }

                seenWidths.Dispose();
                seenHeights.Dispose();

                for (int i = 0; i != 20; i++)
                {
                    newWorldEntities.DestroyEntity(entities[i]);
                }

                entities.Dispose();
            }

            Assert.IsTrue(newWorldEntities.Debug.IsSharedComponentManagerEmpty());

            world.Dispose();
            reader.Dispose();
        }
Exemplo n.º 13
0
        static int WriteEntityScene(EntityManager scene, Hash128 sceneGUID, string subsection, GameObjectConversionSettings settings, out int objectReferenceCount, out ReferencedUnityObjects objRefs, NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapInfos = default)
        {
            k_ProfileEntitiesSceneSave.Begin();
            var ctx = settings.AssetImportContext;
            var entitiesBinaryPath = GetSceneWritePath(sceneGUID, EntityScenesPaths.PathType.EntitiesBinary, subsection, ctx);
            var objRefsPath        = GetSceneWritePath(sceneGUID, EntityScenesPaths.PathType.EntitiesUnityObjectReferences, subsection, ctx);

            objectReferenceCount = 0;

            EnsureFileIsWritableOrThrow(entitiesBinaryPath, ctx);

            // Write binary entity file
            int entitySceneFileSize = 0;

            using (var writer = new StreamBinaryWriter(entitiesBinaryPath))
            {
                if (entityRemapInfos.IsCreated)
                {
                    SerializeUtilityHybrid.Serialize(scene, writer, out objRefs, entityRemapInfos);
                }
                else
                {
                    SerializeUtilityHybrid.Serialize(scene, writer, out objRefs);
                }
                entitySceneFileSize = (int)writer.Length;

                // Write object references
                k_ProfileEntitiesSceneWriteObjRefs.Begin();
                if (objRefs != null)
                {
                    var serializedObjectList = new List <UnityObject>();
                    serializedObjectList.Add(objRefs);

                    for (int i = 0; i != objRefs.Array.Length; i++)
                    {
                        var obj = objRefs.Array[i];
                        if (obj != null && !EditorUtility.IsPersistent(obj))
                        {
                            var saveInBuild = (obj.hideFlags & HideFlags.DontSaveInBuild) == 0;
                            if (saveInBuild)
                            {
                                serializedObjectList.Add(obj);
                            }
                            else
                            {
                                objRefs.Array[i] = null;
                            }
                        }
                    }

                    UnityEditorInternal.InternalEditorUtility.SaveToSerializedFileAndForget(serializedObjectList.ToArray(), objRefsPath, false);
                    objectReferenceCount = objRefs.Array.Length;
                }
                k_ProfileEntitiesSceneWriteObjRefs.End();
            }
            k_ProfileEntitiesSceneSave.End();
            return(entitySceneFileSize);
        }
Exemplo n.º 14
0
        public static void SerializeObjectReferences(EntityManager manager, BinaryWriter writer, UnityEngine.Object[] referencedObjects, out ReferencedUnityObjects objRefs)
        {
            objRefs = null;

            if (referencedObjects != null && referencedObjects.Length > 0)
            {
                objRefs       = ScriptableObject.CreateInstance <ReferencedUnityObjects>();
                objRefs.Array = referencedObjects;
            }
        }
Exemplo n.º 15
0
 public static void Serialize(EntityManager manager, BinaryWriter writer, out ReferencedUnityObjects objRefs, NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapInfos)
 {
     object[] referencedObjects;
     SerializeUtility.SerializeWorld(manager, writer, out referencedObjects, entityRemapInfos);
     SerializeObjectReferences(manager, writer, (UnityEngine.Object[])referencedObjects, out objRefs);
 }
Exemplo n.º 16
0
 public static void Serialize(EntityManager manager, BinaryWriter writer, out ReferencedUnityObjects objRefs)
 {
     SerializeUtility.SerializeWorld(manager, writer, out var referencedObjects);
     SerializeObjectReferences(manager, writer, (UnityEngine.Object[])referencedObjects, out objRefs);
 }
Exemplo n.º 17
0
        public static void SerializeObjectReferences(UnityEngine.Object[] referencedObjects, out ReferencedUnityObjects objRefs)
        {
            objRefs = null;

            if (referencedObjects?.Length > 0)
            {
                objRefs       = UnityEngine.ScriptableObject.CreateInstance <ReferencedUnityObjects>();
                objRefs.Array = referencedObjects;
            }
        }
        static unsafe NativeList <RuntimeGlobalObjectId> ReferencedUnityObjectsToRuntimeGlobalObjectIds(ReferencedUnityObjects referencedUnityObjects, Allocator allocator = Allocator.Temp)
        {
            var globalObjectIds     = new GlobalObjectId[referencedUnityObjects.Array.Length];
            var runtimeGlobalObjIDs = new NativeList <RuntimeGlobalObjectId>(globalObjectIds.Length, allocator);

            GlobalObjectId.GetGlobalObjectIdsSlow(referencedUnityObjects.Array, globalObjectIds);

            for (int i = 0; i != globalObjectIds.Length; i++)
            {
                var globalObjectId = globalObjectIds[i];

                //@TODO: HACK (Object is a scene object)
                if (globalObjectId.identifierType == 2)
                {
                    Debug.LogWarning($"{referencedUnityObjects.Array[i]} is part of a scene, LiveLink can't transfer scene objects. (Note: LiveConvertSceneView currently triggers this)");
                    continue;
                }

                if (globalObjectId.assetGUID == new GUID())
                {
                    //@TODO: How do we handle this
                    Debug.LogWarning($"{referencedUnityObjects.Array[i]} has no valid GUID. LiveLink currently does not support built-in assets.");
                    continue;
                }

                var runtimeGlobalObjectId =
                    System.Runtime.CompilerServices.Unsafe.AsRef <RuntimeGlobalObjectId>(&globalObjectId);
                runtimeGlobalObjIDs.Add(runtimeGlobalObjectId);
            }

            return(runtimeGlobalObjIDs);
        }