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(); } }
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); }
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"); }
// 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(); }
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); }
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(); }