void SendChangeSet(LiveLinkChangeSet entityChangeSet, int playerID) { var buffer = entityChangeSet.Serialize(); LiveLinkMsg.LogSend($"EntityChangeSet patch: '{buffer.Length}' bytes, scene '{entityChangeSet.SceneGUID}'"); m_Connection.Send(LiveLinkMsg.EditorReceiveEntityChangeSet, buffer, playerID); }
static LiveLinkChangeSet SerializeAndDeserialize(LiveLinkChangeSet srcChange) { var resolver = new GlobalAssetObjectResolver(); var bytes = srcChange.Serialize(); // Serialize Changes var resourcePacket = new EntityChangeSetSerialization.ResourcePacket(bytes); foreach (var asset in resourcePacket.GlobalObjectIds) { var manifest = ScriptableObject.CreateInstance <AssetObjectManifest>(); AssetObjectManifestBuilder.BuildManifest(asset.AssetGUID, manifest); resolver.AddAsset(asset.AssetGUID, new Unity.Entities.Hash128(), manifest, null); } // Deserialize LiveLinkChangeSet changeSet; try { changeSet = LiveLinkChangeSet.Deserialize(resourcePacket, resolver); } finally { resourcePacket.Dispose(); resolver.DisposeObjectManifests(); } return(changeSet); }
public void DeserializeWithDifferentDataLayoutThrows() { using (var differ = new EntityManagerDiffer(SrcWorld.EntityManager, Allocator.TempJob)) { var entity = SrcEntityManager.CreateEntity(); SrcEntityManager.AddComponentData(entity, CreateEntityGuid()); SrcEntityManager.AddComponentData(entity, new EcsTestData(5)); var options = EntityManagerDifferOptions.IncludeForwardChangeSet | EntityManagerDifferOptions.FastForwardShadowWorld; using (var changes = differ.GetChanges(options, Allocator.TempJob)) { var typeHashes = changes.ForwardChangeSet.TypeHashes; var modifiedTypeHash = typeHashes[0]; modifiedTypeHash.StableTypeHash += 1; typeHashes[0] = modifiedTypeHash; var srcChange = new LiveLinkChangeSet { Changes = changes.ForwardChangeSet }; Assert.Throws <ArgumentException>(() => SerializeAndDeserialize(srcChange)); } } }
public void CanSerializeAndDeserializeManagedComponents() { using (var differ = new EntityManagerDiffer(SrcWorld.EntityManager, Allocator.TempJob)) { var entityGuid = CreateEntityGuid(); var entity = SrcEntityManager.CreateEntity(); var srcManagedComponent = new EcsTestManagedDataEntity { value0 = "Hello", value2 = 42, nullField = new ClassWithClassFields { ClassWithString = new ClassWithString { String = "World" } } }; SrcEntityManager.AddComponentData(entity, entityGuid); SrcEntityManager.AddComponentData(entity, srcManagedComponent); SrcEntityManager.AddComponentData(entity, (EcsTestManagedComponent2)null); var options = EntityManagerDifferOptions.IncludeForwardChangeSet | EntityManagerDifferOptions.FastForwardShadowWorld; using (var changes = differ.GetChanges(options, Allocator.TempJob)) { var srcChange = new LiveLinkChangeSet { Changes = changes.ForwardChangeSet, SceneName = "Boing", UnloadAllPreviousEntities = true, SceneGUID = new Unity.Entities.Hash128(), FramesToRetainBlobAssets = 1 }; var changeSet = SerializeAndDeserialize(srcChange); AssertChangeSetsAreEqual(srcChange, changeSet); EntityPatcher.ApplyChangeSet(DstEntityManager, changeSet.Changes); changeSet.Dispose(); } var dstManagedComponent = GetManagedComponentData <EcsTestManagedDataEntity>(DstEntityManager, entityGuid); Assert.That(dstManagedComponent, Is.Not.Null); Assert.That(dstManagedComponent, Is.Not.SameAs(srcManagedComponent)); Assert.That(dstManagedComponent.value0, Is.EqualTo(srcManagedComponent.value0)); Assert.That(dstManagedComponent.value1, Is.EqualTo(srcManagedComponent.value1)); Assert.That(dstManagedComponent.value2, Is.EqualTo(srcManagedComponent.value2)); Assert.That(dstManagedComponent.nullField, Is.Not.SameAs(srcManagedComponent.nullField)); Assert.That(dstManagedComponent.nullField.ClassWithString, Is.Not.SameAs(srcManagedComponent.nullField.ClassWithString)); Assert.That(dstManagedComponent.nullField.ClassWithString.String, Is.EqualTo(srcManagedComponent.nullField.ClassWithString.String)); Assert.That(GetManagedComponentData <EcsTestManagedComponent2>(DstEntityManager, entityGuid), Is.Null); } }
static void AssertChangeSetsAreEqual(LiveLinkChangeSet srcChange, LiveLinkChangeSet dstChange) { Assert.AreEqual(srcChange.SceneName, dstChange.SceneName); Assert.AreEqual(srcChange.UnloadAllPreviousEntities, dstChange.UnloadAllPreviousEntities); Assert.AreEqual(srcChange.SceneGUID, dstChange.SceneGUID); Assert.AreEqual(srcChange.Changes.DestroyedEntityCount, dstChange.Changes.DestroyedEntityCount); Assert.AreEqual(srcChange.Changes.CreatedEntityCount, dstChange.Changes.CreatedEntityCount); Assert.AreEqual(srcChange.Changes.AddComponents.Length, dstChange.Changes.AddComponents.Length); Assert.AreEqual(srcChange.Changes.SetComponents.Length, dstChange.Changes.SetComponents.Length); Assert.AreEqual(srcChange.Changes.SetSharedComponents.Length, dstChange.Changes.SetSharedComponents.Length); }
public void PatchWithObjectReferenceResolving() { var material = AssetDatabase.LoadAssetAtPath <Material>("Packages/com.unity.entities/Unity.Scenes.Hybrid.Tests/Test.mat"); using (var differ = new EntityManagerDiffer(SrcWorld.EntityManager, Allocator.TempJob)) { var entityGuid = CreateEntityGuid(); var entity = SrcEntityManager.CreateEntity(); SrcEntityManager.AddComponentData(entity, entityGuid); SrcEntityManager.AddSharedComponentData(entity, new ComponentWithObjectRef { Material = material }); SrcEntityManager.AddComponentData(entity, new EcsTestData(5)); var options = EntityManagerDifferOptions.IncludeForwardChangeSet | EntityManagerDifferOptions.FastForwardShadowWorld; using (var changes = differ.GetChanges(options, Allocator.TempJob)) { var srcChange = new LiveLinkChangeSet { Changes = changes.ForwardChangeSet, SceneName = "Boing", UnloadAllPreviousEntities = true, SceneGUID = new Unity.Entities.Hash128(), FramesToRetainBlobAssets = 1 }; var changeSet = SerializeAndDeserialize(srcChange); AssertChangeSetsAreEqual(srcChange, changeSet); EntityPatcher.ApplyChangeSet(DstEntityManager, changeSet.Changes); changeSet.Dispose(); } var dstMaterial = GetSharedComponentData <ComponentWithObjectRef>(DstEntityManager, entityGuid).Material; Assert.AreEqual(material, dstMaterial); Assert.AreEqual(5, GetComponentData <EcsTestData>(DstEntityManager, entityGuid).value); } }
public static LiveLinkChangeSet UpdateLiveLink(Scene scene, Hash128 sceneGUID, ref LiveLinkDiffGenerator liveLinkData, int sceneDirtyID, LiveLinkMode mode, BuildConfiguration config, out NativeArray <GUID> assetDependencies) { //Debug.Log("ApplyLiveLink: " + scene.SceneName); int framesToRetainBlobAssets = RetainBlobAssetsSetting.GetFramesToRetainBlobAssets(config); var liveLinkEnabled = mode != LiveLinkMode.Disabled; if (liveLinkData != null && liveLinkData._LiveLinkEnabled != liveLinkEnabled) { liveLinkData.Dispose(); liveLinkData = null; } var unloadAllPreviousEntities = liveLinkData == null; if (liveLinkData == null) { liveLinkData = new LiveLinkDiffGenerator(sceneGUID, liveLinkEnabled); } if (!liveLinkEnabled) { assetDependencies = default; return(new LiveLinkChangeSet { UnloadAllPreviousEntities = unloadAllPreviousEntities, SceneName = scene.name, SceneGUID = sceneGUID, FramesToRetainBlobAssets = framesToRetainBlobAssets }); } var flags = GameObjectConversionUtility.ConversionFlags.AddEntityGUID | GameObjectConversionUtility.ConversionFlags.AssignName | GameObjectConversionUtility.ConversionFlags.GameViewLiveLink; if (mode == LiveLinkMode.LiveConvertSceneView) { flags |= GameObjectConversionUtility.ConversionFlags.SceneViewLiveLink; } liveLinkData.Convert(scene, sceneGUID, flags, config, out assetDependencies); var convertedEntityManager = liveLinkData._ConvertedWorld.EntityManager; // We don't know the scene tag of the destination world, so we create a null Scene Tag. // In the patching code this will be translated into the final scene entity. convertedEntityManager.AddSharedComponentData(liveLinkData._MissingSceneQuery, new SceneTag { SceneEntity = Entity.Null }); #if UNITY_2020_1_OR_NEWER convertedEntityManager.AddSharedComponentData(liveLinkData._MissingRenderDataQuery, new EditorRenderData { SceneCullingMask = UnityEditor.SceneManagement.SceneCullingMasks.GameViewObjects, PickableObject = null }); #else convertedEntityManager.AddSharedComponentData(liveLinkData._MissingRenderDataQuery, new EditorRenderData { SceneCullingMask = EditorRenderData.LiveLinkEditGameViewMask, PickableObject = null }); #endif var options = EntityManagerDifferOptions.IncludeForwardChangeSet | EntityManagerDifferOptions.FastForwardShadowWorld | EntityManagerDifferOptions.ValidateUniqueEntityGuid | EntityManagerDifferOptions.ClearMissingReferences; var changes = new LiveLinkChangeSet { Changes = liveLinkData._LiveLinkDiffer.GetChanges(options, Allocator.TempJob).ForwardChangeSet, UnloadAllPreviousEntities = unloadAllPreviousEntities, SceneName = scene.name, SceneGUID = sceneGUID, FramesToRetainBlobAssets = framesToRetainBlobAssets }; liveLinkData.LiveLinkDirtyID = sceneDirtyID; // convertedEntityManager.Debug.CheckInternalConsistency(); return(changes); }
public static LiveLinkChangeSet UpdateLiveLink(Scene scene, Hash128 sceneGUID, ref LiveLinkDiffGenerator liveLinkData, int sceneDirtyID, LiveLinkMode mode, GUID configGUID, BuildConfiguration config) { //Debug.Log("ApplyLiveLink: " + scene.SceneName); int framesToRetainBlobAssets = RetainBlobAssetsSetting.GetFramesToRetainBlobAssets(config); var liveLinkEnabled = mode != LiveLinkMode.Disabled; if (liveLinkData != null && liveLinkData._LiveLinkEnabled != liveLinkEnabled) { liveLinkData.Dispose(); liveLinkData = null; } var unloadAllPreviousEntities = liveLinkData == null; if (liveLinkData == null) { liveLinkData = new LiveLinkDiffGenerator(scene, sceneGUID, configGUID, config, liveLinkEnabled); } else if (liveLinkData._Scene != scene || !ReferenceEquals(liveLinkData._buildConfiguration, config) || liveLinkData._buildConfigurationGUID != configGUID) { liveLinkData._Scene = scene; liveLinkData._buildConfigurationGUID = configGUID; liveLinkData._buildConfiguration = config; liveLinkData._RequestCleanConversion = true; } if (!liveLinkEnabled) { return(new LiveLinkChangeSet { UnloadAllPreviousEntities = unloadAllPreviousEntities, SceneName = scene.name, SceneGUID = sceneGUID, FramesToRetainBlobAssets = framesToRetainBlobAssets }); } var flags = GameObjectConversionUtility.ConversionFlags.AddEntityGUID | GameObjectConversionUtility.ConversionFlags.AssignName | GameObjectConversionUtility.ConversionFlags.GameViewLiveLink; if (mode == LiveLinkMode.LiveConvertSceneView) { flags |= GameObjectConversionUtility.ConversionFlags.SceneViewLiveLink; } if (mode == LiveLinkMode.LiveConvertStandalonePlayer) { flags |= GameObjectConversionUtility.ConversionFlags.IsBuildingForPlayer; } liveLinkData.Convert(flags); const EntityManagerDifferOptions options = EntityManagerDifferOptions.IncludeForwardChangeSet | EntityManagerDifferOptions.FastForwardShadowWorld | EntityManagerDifferOptions.ValidateUniqueEntityGuid | EntityManagerDifferOptions.ClearMissingReferences; var changes = new LiveLinkChangeSet { Changes = liveLinkData._LiveLinkDiffer.GetChanges(options, Allocator.TempJob).ForwardChangeSet, UnloadAllPreviousEntities = unloadAllPreviousEntities, SceneName = scene.name, SceneGUID = sceneGUID, FramesToRetainBlobAssets = framesToRetainBlobAssets }; #if !UNITY_2020_2_OR_NEWER liveLinkData.LiveLinkDirtyID = sceneDirtyID; #endif // convertedEntityManager.Debug.CheckInternalConsistency(); return(changes); }