コード例 #1
0
 public bool Equals(EcsPersistingTestData other)
 {
     return(data.Equals(other.data));
 }
コード例 #2
0
        public unsafe void TestApplyStoredData([Values(0, 1, 2, 3, 60, 401)] int total)
        {
            // Preparation
            CreateEntities(total);

            int entityAmount3 = total / 3;
            int entityAmount1 = entityAmount3 + (total % 3 > 0 ? 1 : 0);
            int entityAmount2 = entityAmount3 + (total % 3 > 1 ? 1 : 0);

            var array1IntData   = new NativeArray <byte>(entityAmount1 * (UnsafeUtility.SizeOf <EcsPersistingTestData>() + PersistenceMetaData.SizeOfStruct), Allocator.TempJob);
            var array2FloatData = new NativeArray <byte>(entityAmount2 * (UnsafeUtility.SizeOf <EcsPersistingFloatTestData2>() + PersistenceMetaData.SizeOfStruct), Allocator.TempJob);
            var array5IntData   = new NativeArray <byte>(entityAmount3 * (UnsafeUtility.SizeOf <EcsPersistingTestData5>() + PersistenceMetaData.SizeOfStruct), Allocator.TempJob);

            var query1 = m_Manager.CreateEntityQuery(typeof(EcsPersistingTestData), typeof(PersistenceState));
            var query2 = m_Manager.CreateEntityQuery(typeof(EcsPersistingFloatTestData2), typeof(PersistenceState));
            var query3 = m_Manager.CreateEntityQuery(typeof(EcsPersistingTestData5), typeof(PersistenceState));

            Entities.WithAll <PersistenceState>().ForEach(entity =>
            {
                int index = m_Manager.GetComponentData <PersistenceState>(entity).ArrayIndex;
                if (index < 3)
                {
                    m_Manager.DestroyEntity(entity);
                }
                else if (m_Manager.HasComponent <EcsPersistingTestData>(entity))
                {
                    PersistenceMetaData *metaDataPtr = (PersistenceMetaData *)((byte *)array1IntData.GetUnsafePtr() + index * (UnsafeUtility.SizeOf <EcsPersistingTestData>() + PersistenceMetaData.SizeOfStruct));
                    *metaDataPtr = new PersistenceMetaData(0, 1);
                    EcsPersistingTestData *dataPtr = (EcsPersistingTestData *)(metaDataPtr + 1);
                    *dataPtr = m_Manager.GetComponentData <EcsPersistingTestData>(entity).Modified();
                }
                else if (m_Manager.HasComponent <EcsPersistingFloatTestData2>(entity))
                {
                    PersistenceMetaData *metaDataPtr = (PersistenceMetaData *)((byte *)array2FloatData.GetUnsafePtr() + index * (UnsafeUtility.SizeOf <EcsPersistingFloatTestData2>() + PersistenceMetaData.SizeOfStruct));
                    *metaDataPtr = new PersistenceMetaData(0, 1);
                    EcsPersistingFloatTestData2 *dataPtr = (EcsPersistingFloatTestData2 *)(metaDataPtr + 1);
                    *dataPtr = m_Manager.GetComponentData <EcsPersistingFloatTestData2>(entity).Modified();
                }
                else if (m_Manager.HasComponent <EcsPersistingTestData5>(entity))
                {
                    PersistenceMetaData *metaDataPtr = (PersistenceMetaData *)((byte *)array5IntData.GetUnsafePtr() + index * (UnsafeUtility.SizeOf <EcsPersistingTestData5>() + PersistenceMetaData.SizeOfStruct));
                    *metaDataPtr = new PersistenceMetaData(0, 1);
                    EcsPersistingTestData5 *dataPtr = (EcsPersistingTestData5 *)(metaDataPtr + 1);
                    *dataPtr = m_Manager.GetComponentData <EcsPersistingTestData5>(entity).Modified();
                }
            });
            int amount1 = query1.CalculateEntityCount();
            int amount2 = query2.CalculateEntityCount();
            int amount3 = query3.CalculateEntityCount();

            Entities.WithAll <PersistenceState>().ForEach((Entity entity) =>
            {
                int index = m_Manager.GetComponentData <PersistenceState>(entity).ArrayIndex;
                if (index % 2 == 1)
                {
                    if (m_Manager.HasComponent <EcsPersistingTestData>(entity))
                    {
                        m_Manager.RemoveComponent <EcsPersistingTestData>(entity);
                    }
                    else if (m_Manager.HasComponent <EcsPersistingFloatTestData2>(entity))
                    {
                        m_Manager.RemoveComponent <EcsPersistingFloatTestData2>(entity);
                    }
                    else if (m_Manager.HasComponent <EcsPersistingTestData5>(entity))
                    {
                        m_Manager.RemoveComponent <EcsPersistingTestData5>(entity);
                    }
                }
            });

            // Action
            using (EntityCommandBuffer cmds = new EntityCommandBuffer(Allocator.TempJob))
            {
                new CopyByteArrayToComponentData()
                {
                    ComponentTypeHandle  = m_Manager.GetDynamicComponentTypeHandle(typeof(EcsPersistingTestData)),
                    TypeSize             = UnsafeUtility.SizeOf <EcsPersistingTestData>(),
                    PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                    RawContainerData     = array1IntData,
                    SubArrayOffset       = 0,
                    SubArrayByteSize     = array1IntData.Length,
                    ComponentType        = typeof(EcsPersistingTestData),
                    EntityType           = m_Manager.GetEntityTypeHandle(),
                    Ecb = cmds.AsParallelWriter()
                }.Run(m_Manager.CreateEntityQuery(typeof(EcsTestData), typeof(PersistenceState)));
                cmds.Playback(m_Manager);
            }

            using (EntityCommandBuffer cmds = new EntityCommandBuffer(Allocator.TempJob))
            {
                new CopyByteArrayToComponentData()
                {
                    ComponentTypeHandle  = m_Manager.GetDynamicComponentTypeHandle(typeof(EcsPersistingFloatTestData2)),
                    TypeSize             = UnsafeUtility.SizeOf <EcsPersistingFloatTestData2>(),
                    PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                    RawContainerData     = array2FloatData,
                    SubArrayOffset       = 0,
                    SubArrayByteSize     = array2FloatData.Length,
                    ComponentType        = typeof(EcsPersistingFloatTestData2),
                    EntityType           = m_Manager.GetEntityTypeHandle(),
                    Ecb = cmds.AsParallelWriter()
                }.Run(m_Manager.CreateEntityQuery(typeof(EcsTestFloatData2), typeof(PersistenceState)));
                cmds.Playback(m_Manager);
            }

            using (EntityCommandBuffer cmds = new EntityCommandBuffer(Allocator.TempJob))
            {
                new CopyByteArrayToComponentData()
                {
                    ComponentTypeHandle  = m_Manager.GetDynamicComponentTypeHandle(typeof(EcsPersistingTestData5)),
                    TypeSize             = UnsafeUtility.SizeOf <EcsPersistingTestData5>(),
                    PersistenceStateType = m_Manager.GetComponentTypeHandle <PersistenceState>(true),
                    RawContainerData     = array5IntData,
                    SubArrayOffset       = 0,
                    SubArrayByteSize     = array5IntData.Length,
                    ComponentType        = typeof(EcsPersistingTestData5),
                    EntityType           = m_Manager.GetEntityTypeHandle(),
                    Ecb = cmds.AsParallelWriter()
                }.Run(m_Manager.CreateEntityQuery(typeof(EcsTestData5), typeof(PersistenceState)));
                cmds.Playback(m_Manager);
            }

            // Check Results
            Entities.With(query1).ForEach(entity =>
            {
                var newData      = m_Manager.GetComponentData <EcsPersistingTestData>(entity);
                var originalData = new EcsPersistingTestData()
                {
                    data = m_Manager.GetComponentData <EcsTestData>(entity)
                };
                Assert.True(newData.Equals(originalData.Modified()), "CopyByteArrayToComponentData:: Restored data on entity is incorrect.");
            });

            Entities.With(query2).ForEach(entity =>
            {
                var newData      = m_Manager.GetComponentData <EcsPersistingFloatTestData2>(entity);
                var originalData = new EcsPersistingFloatTestData2()
                {
                    data = m_Manager.GetComponentData <EcsTestFloatData2>(entity)
                };
                Assert.True(newData.Equals(originalData.Modified()), "CopyByteArrayToComponentData:: Restored data on entity is incorrect.");
            });

            Entities.With(query3).ForEach(entity =>
            {
                var newData      = m_Manager.GetComponentData <EcsPersistingTestData5>(entity);
                var originalData = new EcsPersistingTestData5()
                {
                    data = m_Manager.GetComponentData <EcsTestData5>(entity)
                };
                Assert.True(newData.Equals(originalData.Modified()), "CopyByteArrayToComponentData:: Restored data on entity is incorrect.");
            });

            // Check Results
            Assert.AreEqual(amount1, query1.CalculateEntityCount(), "AddMissingComponents:: Not all missing components have not been restored");
            Entities.With(query1).ForEach(entity =>
            {
                var newData      = m_Manager.GetComponentData <EcsPersistingTestData>(entity);
                var originalData = new EcsPersistingTestData()
                {
                    data = m_Manager.GetComponentData <EcsTestData>(entity)
                };
                Assert.True(newData.Equals(originalData.Modified()), "AddMissingComponents:: Restored data on entity is incorrect.");
            });

            Assert.AreEqual(amount2, query2.CalculateEntityCount(), "AddMissingComponents:: Not all missing components have not been restored");
            Entities.With(query2).ForEach(entity =>
            {
                var newData      = m_Manager.GetComponentData <EcsPersistingFloatTestData2>(entity);
                var originalData = new EcsPersistingFloatTestData2()
                {
                    data = m_Manager.GetComponentData <EcsTestFloatData2>(entity)
                };
                Assert.True(newData.Equals(originalData.Modified()), "AddMissingComponents:: Restored data on entity is incorrect.");
            });

            Assert.AreEqual(amount3, query3.CalculateEntityCount(), "AddMissingComponents:: Not all missing components have not been restored");
            Entities.With(query3).ForEach(entity =>
            {
                var newData      = m_Manager.GetComponentData <EcsPersistingTestData5>(entity);
                var originalData = new EcsPersistingTestData5()
                {
                    data = m_Manager.GetComponentData <EcsTestData5>(entity)
                };
                Assert.True(newData.Equals(originalData.Modified()), "AddMissingComponents:: Restored data on entity is incorrect.");
            });

            // Cleanup
            array1IntData.Dispose();
            array2FloatData.Dispose();
            array5IntData.Dispose();
            m_Manager.DestroyEntity(m_Manager.CreateEntityQuery(typeof(PersistenceState)));
        }