示例#1
0
    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();
        }
    }
示例#2
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 void SerializingSharedComponent_WhenMoreThanOne_AndProxyHasDisallowMultiple_DoesNotCrash()
        {
            for (var i = 0; i < 20; ++i)
            {
                var entity = m_Manager.CreateEntity();
                m_Manager.AddSharedComponentData(entity, new MockSharedDisallowMultiple {
                    Value = i
                });
                m_Manager.AddComponentData(entity, new EcsTestData(i));
            }

            var        writer           = new TestBinaryWriter();
            GameObject sharedComponents = null;

            try
            {
                Assert.That(
                    () => SerializeUtilityHybrid.Serialize(m_Manager, writer, out sharedComponents),
                    Throws.ArgumentException.With.Message.Matches(@"\bDisallowMultipleComponent\b")
                    );
            }
            finally
            {
                writer.Dispose();
                if (sharedComponents != null)
                {
                    GameObject.DestroyImmediate(sharedComponents);
                }
            }
        }
示例#4
0
        static int WriteEntityScene(EntityManager scene, Hash128 sceneGUID, string subsection, GameObjectConversionSettings settings, out int objectReferenceCount, 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);
            ReferencedUnityObjects objRefs;

            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 serializedObjectArray = new List <UnityObject>();
                    serializedObjectArray.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)
                            {
                                serializedObjectArray.Add(obj);
                            }
                            else
                            {
                                objRefs.Array[i] = null;
                            }
                        }
                    }

                    UnityEditorInternal.InternalEditorUtility.SaveToSerializedFileAndForget(serializedObjectArray.ToArray(), objRefsPath, false);
                    objectReferenceCount = objRefs.Array.Length;
                }
                k_ProfileEntitiesSceneWriteObjRefs.End();
            }
            k_ProfileEntitiesSceneSave.End();
            return(entitySceneFileSize);
        }
        static int WriteEntityScene(EntityManager scene, Entities.Hash128 sceneGUID, string subsection, NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapInfos = default(NativeArray <EntityRemapUtility.EntityRemapInfo>))
        {
            k_ProfileEntitiesSceneSave.Begin();

            var entitiesBinaryPath = EntityScenesPaths.GetPathAndCreateDirectory(sceneGUID, EntityScenesPaths.PathType.EntitiesBinary, subsection);
            var sharedDataPath     = EntityScenesPaths.GetPathAndCreateDirectory(sceneGUID, EntityScenesPaths.PathType.EntitiesSharedComponents, subsection);

            GameObject sharedComponents;

            // We're going to do file writing manually, so make sure to do version control dance if needed
            if (Provider.isActive && !AssetDatabase.IsOpenForEdit(entitiesBinaryPath, StatusQueryOptions.UseCachedIfPossible))
            {
                var task = Provider.Checkout(entitiesBinaryPath, CheckoutMode.Asset);
                task.Wait();
                if (!task.success)
                {
                    throw new System.Exception($"Failed to checkout entity cache file {entitiesBinaryPath}");
                }
            }

            // Write binary entity file
            int entitySceneFileSize = 0;

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

            // Write shared component data prefab
            k_ProfileEntitiesSceneCreatePrefab.Begin();
            //var oldPrefab = AssetDatabase.LoadMainAssetAtPath(sharedDataPath);
            //if (oldPrefab == null)
            //        PrefabUtility.CreatePrefab(sharedDataPath, sharedComponents, ReplacePrefabOptions.ReplaceNameBased);

            if (sharedComponents != null)
            {
                PrefabUtility.SaveAsPrefabAsset(sharedComponents, sharedDataPath);
            }

            //else
            //    PrefabUtility.Save
            //PrefabUtility.ReplacePrefab(sharedComponents, oldPrefab, ReplacePrefabOptions.ReplaceNameBased);

            Object.DestroyImmediate(sharedComponents);
            k_ProfileEntitiesSceneCreatePrefab.End();


            k_ProfileEntitiesSceneSave.End();
            return(entitySceneFileSize);
        }
示例#6
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();
        }
    }
示例#7
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);
        }
    }
        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);
        }
        static int WriteEntityScene(EntityManager scene, Entities.Hash128 sceneGUID, string subsection, NativeArray <EntityRemapUtility.EntityRemapInfo> entityRemapInfos = default(NativeArray <EntityRemapUtility.EntityRemapInfo>))
        {
            k_ProfileEntitiesSceneSave.Begin();

            var entitiesBinaryPath = EntityScenesPaths.GetPathAndCreateDirectory(sceneGUID, EntityScenesPaths.PathType.EntitiesBinary, subsection);
            var sharedDataPath     = EntityScenesPaths.GetPathAndCreateDirectory(sceneGUID, EntityScenesPaths.PathType.EntitiesSharedComponents, subsection);

            GameObject sharedComponents;

            // Write binary entity file
            int entitySceneFileSize = 0;

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

            // Write shared component data prefab
            k_ProfileEntitiesSceneCreatePrefab.Begin();
            //var oldPrefab = AssetDatabase.LoadMainAssetAtPath(sharedDataPath);
            //if (oldPrefab == null)
            //        PrefabUtility.CreatePrefab(sharedDataPath, sharedComponents, ReplacePrefabOptions.ReplaceNameBased);

            if (sharedComponents != null)
            {
                PrefabUtility.SaveAsPrefabAsset(sharedComponents, sharedDataPath);
            }

            //else
            //    PrefabUtility.Save
            //PrefabUtility.ReplacePrefab(sharedComponents, oldPrefab, ReplacePrefabOptions.ReplaceNameBased);

            Object.DestroyImmediate(sharedComponents);
            k_ProfileEntitiesSceneCreatePrefab.End();


            k_ProfileEntitiesSceneSave.End();
            return(entitySceneFileSize);
        }
示例#10
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");
        }
示例#11
0
        public void SerializingSharedComponent_WhenMoreThanOne_AndWrapperHasDisallowMultiple_DoesNotCrash()
        {
            for (var i = 0; i < 20; ++i)
            {
                var entity = m_Manager.CreateEntity();
                m_Manager.AddSharedComponentData(entity, new MockSharedDisallowMultiple {
                    Value = i
                });
                m_Manager.AddComponentData(entity, new EcsTestData(i));
            }

            var        writer           = new TestBinaryWriter();
            GameObject sharedComponents = null;

            try
            {
                var ex = Assert.Throws <ArgumentException>(
                    () => SerializeUtilityHybrid.Serialize(m_Manager, writer, out sharedComponents)
                    );
                Assert.That(
                    ex.Message,
                    Is.EqualTo(
                        string.Format(
                            "{0} is marked with {1}, but current implementation of {2} serializes all shared components on a single GameObject.",
                            typeof(MockSharedDisallowMultipleComponent),
                            typeof(DisallowMultipleComponent),
                            nameof(SerializeUtilityHybrid.SerializeSharedComponents)
                            )
                        )
                    );
            }
            finally
            {
                writer.Dispose();
                if (sharedComponents != null)
                {
                    GameObject.DestroyImmediate(sharedComponents);
                }
            }
        }
示例#12
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();
        }
示例#13
0
    private void SaveData()
    {
        if (!Directory.Exists("Saves"))
        {
            Directory.CreateDirectory("Saves");
        }

        var formatter = new BinaryFormatter();
        var objects   = new List <System.Object>();
        var saveFile  = File.Create("Saves/Save.bin");

        // DOTS Save world
        if (World.All.Count < 1)
        {
            return;
        }
        using (var writer = new StreamWriter(yamlpath))
        {
            // Path for saving world
            var binaryWorldPath = _FileLocation + "\\" + "DefaultWorld.world";  // path backslash for system access
            var binaryWriter    = new StreamBinaryWriter(binaryWorldPath);

            // Save whole world
            // not hybrid SerializeUtility.SerializeWorld(em, binaryWriter, out var objectReferences);
            var referencedObjectsPath = "Assets/ReferencedUnityWorldObjects.asset"; // path forward slash for asset access
            SerializeUtilityHybrid.Serialize(em, binaryWriter, out ReferencedUnityObjects objectReferences);
            binaryWriter.Dispose();

            // For debugging: log all referenced objects which are saved QueryReferences.Query(objectReferences);
            AssetDatabase.CreateAsset(objectReferences, referencedObjectsPath);
            objects.Add(objectReferences);

            /*var zx   = GameObject.Find("test");
             * var xm   = zx.GetComponent<MeshFilter>();
             * var m    = xm.sharedMesh;
             * var code = m.GetHashCode();*/
        }

        formatter.Serialize(saveFile, objects);
    }
示例#14
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");
    }
示例#15
0
        /// <summary>
        /// Default save method. Saves world as binary file.
        /// </summary>
        /// <param name="debug"></param>
        public static void Save(bool debug = false)
        {
            if (World.All.Count < 1)
            {
                return;
            }

            var entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;

            // Path for saving world
            var binaryWriter = new StreamBinaryWriter(WorldLocation);

            // Save whole world
            // pure version - SerializeUtility.SerializeWorld(em, binaryWriter, out var objectReferences);
            SerializeUtilityHybrid.Serialize(entityManager, binaryWriter, out var objectReferences);

            if (debug)
            {
                QueryReferences.Query(objectReferences);
            }

            AssetDatabase.CreateAsset(objectReferences, WorldReferencesLocation);
            Debug.Log("Saved");
        }
        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);
        }
示例#17
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();
        }