Beispiel #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();
        }
    protected override void OnUpdate()
    {
        if (Input.GetKeyDown(KeyCode.H))
        {
            Debug.Log($"Saving world...");
            using (var writer = new StreamBinaryWriter(FullPath))
            {
                EntityManager.CompleteAllJobs();
                var q = EntityManager.CreateEntityQuery(typeof(Terminal));
                EntityManager.DestroyEntity(q);
                SerializeUtilityHybrid.Serialize(EntityManager, writer, out _refs);
                int refCount = _refs == null ? 0 : _refs.Array.Length;
                Debug.Log($"RefCount: {refCount}");
            }
        }

        if (Input.GetKeyDown(KeyCode.L))
        {
            Debug.Log("Loading World...");

            var loadWorld = new World("Loading World");
            var em        = loadWorld.EntityManager;
            using (var reader = new StreamBinaryReader(FullPath))
            {
                SerializeUtilityHybrid.Deserialize(em, reader, _refs);
            }

            EntityManager.CompleteAllJobs();
            EntityManager.DestroyEntity(EntityManager.UniversalQuery);

            EntityManager.MoveEntitiesFrom(em);
            loadWorld.Dispose();
        }
    }
Beispiel #3
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();
        }
    }
        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 writer = new TestBinaryWriter();

            GameObject sharedComponents;

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

            var reader = new TestBinaryReader(writer);

            var world = new World("temp");

            SerializeUtilityHybrid.Deserialize(world.GetOrCreateManager <EntityManager>(), reader, sharedComponents);

            var newWorldEntities = world.GetOrCreateManager <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);
                }
                for (int i = 0; i != 20; i++)
                {
                    newWorldEntities.DestroyEntity(entities[i]);
                }

                entities.Dispose();
            }

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

            world.Dispose();
            reader.Dispose();

            Object.DestroyImmediate(sharedComponents);
        }
Beispiel #5
0
        public static void Load()
        {
            if (World.All.Count < 1)
            {
                return;
            }

            // need an empty world to do this
            var world = new World("LoadingWorld");

            using (var reader = new StreamBinaryReader(WorldLocation)) //GetFullPathByName(fileName))
            {
                var objectRefAsset = AssetDatabase.LoadAssetAtPath <ReferencedUnityObjects>(WorldReferencesLocation);
                // Load objects as binary file
                SerializeUtilityHybrid.Deserialize(world.EntityManager, reader, objectRefAsset);
            }

            World.DefaultGameObjectInjectionWorld.EntityManager.DestroyEntity(World.DefaultGameObjectInjectionWorld.EntityManager.UniversalQuery);
            World.DefaultGameObjectInjectionWorld.EntityManager.MoveEntitiesFrom(world.EntityManager);
            Debug.Log("Loaded");
        }
Beispiel #6
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();
        }
Beispiel #7
0
    private void LoadData()
    {
        if (!File.Exists("Saves/Save.bin"))
        {
            return;
        }
        if (World.All.Count < 1)
        {
            return;
        }

        var formatter          = new BinaryFormatter();
        var saveFile           = File.Open("Saves/Save.bin", FileMode.Open);
        var deserializedObject = formatter.Deserialize(saveFile);
        var objects            = deserializedObject as List <Object>;
        var refObjects         = objects[0] as ReferencedUnityObjects;

        // To generate the file we'll test against
        var binaryPath = _FileLocation + "\\" + "DefaultWorld.world";

        // need an empty world to do this
        var loadingWorld = new World("SavingWorld");
        var em           = loadingWorld.EntityManager;

        using (var reader = new StreamBinaryReader(binaryPath))                     //GetFullPathByName(fileName))
        {
            var referencedObjectsPath = "Assets/ReferencedUnityWorldObjects.asset"; // path forward slash for asset access
            var objectRefAsset        = AssetDatabase.LoadAssetAtPath <ReferencedUnityObjects>(referencedObjectsPath);
            // Load objects as binary file
            SerializeUtilityHybrid.Deserialize(em, reader, refObjects);
        }


        World.DefaultGameObjectInjectionWorld.EntityManager.DestroyEntity(World.DefaultGameObjectInjectionWorld.EntityManager.UniversalQuery);
        World.DefaultGameObjectInjectionWorld.EntityManager.MoveEntitiesFrom(em);

        Debug.Log("Loaded");
    }
        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();

            GameObject sharedComponents;

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

            var reader = new TestBinaryReader(writer);

            var world = new World("temp");

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

            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();

            Object.DestroyImmediate(sharedComponents);
        }
Beispiel #9
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();
        }