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);
        }
    }
Пример #7
0
        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);
        }