Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

606 行
22 KiB

using System;
using NUnit.Framework;
using Unity.Collections;
namespace Unity.Entities.Tests
{
class CreateAndDestroyTests : ECSTestsFixture
{
[Test]
unsafe public void CreateAndDestroyOne()
{
var entity = CreateEntityWithDefaultData(10);
m_Manager.DestroyEntity(entity);
AssertDoesNotExist(entity);
}
[Test]
unsafe public void DestroyNullIsIgnored()
{
m_Manager.DestroyEntity(default(Entity));
}
[Test]
unsafe public void DestroyTwiceIsIgnored()
{
var entity = CreateEntityWithDefaultData(10);
m_Manager.DestroyEntity(entity);
m_Manager.DestroyEntity(entity);
}
[Test]
unsafe public void EmptyEntityIsNull()
{
CreateEntityWithDefaultData(10);
Assert.IsFalse(m_Manager.Exists(new Entity()));
}
[Test]
unsafe public void CreateAndDestroyTwo()
{
var entity0 = CreateEntityWithDefaultData(10);
var entity1 = CreateEntityWithDefaultData(11);
m_Manager.DestroyEntity(entity0);
AssertDoesNotExist(entity0);
AssertComponentData(entity1, 11);
m_Manager.DestroyEntity(entity1);
AssertDoesNotExist(entity0);
AssertDoesNotExist(entity1);
}
[TestCaseGeneric(typeof(EcsTestData))]
[TestCaseGeneric(typeof(EcsState1))]
unsafe public void CreateZeroEntities<TComponent>()
where TComponent : struct, IComponentData
{
var array = new NativeArray<Entity>(0, Allocator.Temp);
m_Manager.CreateEntity(m_Manager.CreateArchetype(typeof(TComponent)), array);
array.Dispose();
}
[Test]
unsafe public void InstantiateZeroEntities()
{
var array = new NativeArray<Entity>(0, Allocator.Temp);
var srcEntity = m_Manager.CreateEntity(typeof(EcsTestData));
m_Manager.Instantiate(srcEntity , array);
array.Dispose();
}
[Test]
unsafe public void CreateAndDestroyThree()
{
var entity0 = CreateEntityWithDefaultData(10);
var entity1 = CreateEntityWithDefaultData(11);
m_Manager.DestroyEntity(entity0);
var entity2 = CreateEntityWithDefaultData(12);
AssertDoesNotExist(entity0);
AssertComponentData(entity1, 11);
AssertComponentData(entity2, 12);
}
[Test]
unsafe public void CreateAndDestroyStressTest()
{
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData), typeof(EcsTestData2));
var entities = new NativeArray<Entity>(10000, Allocator.Persistent);
m_Manager.CreateEntity(archetype, entities);
for (int i = 0; i < entities.Length; i++)
AssertComponentData(entities[i], 0);
m_Manager.DestroyEntity(entities);
entities.Dispose();
}
[Test]
unsafe public void CreateAndDestroyShuffleStressTest()
{
Entity[] entities = new Entity[10000];
for (int i = 0; i < entities.Length;i++)
{
entities[i] = CreateEntityWithDefaultData(i);
}
for (int i = 0; i < entities.Length; i++)
{
if (i % 2 == 0)
m_Manager.DestroyEntity(entities[i]);
}
for (int i = 0; i < entities.Length; i++)
{
if (i % 2 == 0)
{
AssertDoesNotExist(entities[i]);
}
else
{
AssertComponentData(entities[i], i);
}
}
for (int i = 0; i < entities.Length; i++)
{
if (i % 2 == 1)
m_Manager.DestroyEntity(entities[i]);
}
for (int i = 0; i < entities.Length; i++)
{
AssertDoesNotExist(entities[i]);
}
}
[Test]
unsafe public void InstantiateStressTest()
{
var entities = new NativeArray<Entity>(10000, Allocator.Persistent);
var srcEntity = CreateEntityWithDefaultData(5);
m_Manager.Instantiate(srcEntity, entities);
for (int i = 0; i < entities.Length; i++)
AssertComponentData(entities[i], 5);
m_Manager.DestroyEntity(entities);
entities.Dispose();
}
[Test]
public void AddRemoveComponent()
{
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData), typeof(EcsTestData2));
var entity = m_Manager.CreateEntity(archetype);
Assert.IsTrue(m_Manager.HasComponent<EcsTestData>(entity));
Assert.IsTrue(m_Manager.HasComponent<EcsTestData2>(entity));
Assert.IsFalse(m_Manager.HasComponent<EcsTestData3>(entity));
m_Manager.AddComponentData<EcsTestData3>(entity, new EcsTestData3(3));
Assert.IsTrue(m_Manager.HasComponent<EcsTestData>(entity));
Assert.IsTrue(m_Manager.HasComponent<EcsTestData2>(entity));
Assert.IsTrue(m_Manager.HasComponent<EcsTestData3>(entity));
Assert.AreEqual(3, m_Manager.GetComponentData<EcsTestData3>(entity).value0);
Assert.AreEqual(3, m_Manager.GetComponentData<EcsTestData3>(entity).value1);
Assert.AreEqual(3, m_Manager.GetComponentData<EcsTestData3>(entity).value2);
m_Manager.RemoveComponent<EcsTestData2>(entity);
Assert.IsTrue(m_Manager.HasComponent<EcsTestData>(entity));
Assert.IsFalse(m_Manager.HasComponent<EcsTestData2>(entity));
Assert.IsTrue(m_Manager.HasComponent<EcsTestData3>(entity));
Assert.AreEqual(3, m_Manager.GetComponentData<EcsTestData3>(entity).value0);
Assert.AreEqual(3, m_Manager.GetComponentData<EcsTestData3>(entity).value1);
Assert.AreEqual(3, m_Manager.GetComponentData<EcsTestData3>(entity).value2);
m_Manager.DestroyEntity(entity);
}
[Test]
public void AddComponentSetsValueOfComponentToDefault()
{
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData));
var dummyEntity = m_Manager.CreateEntity(archetype);
m_Manager.Debug.PoisonUnusedDataInAllChunks(archetype, 0xCD);
var entity = m_Manager.CreateEntity();
m_Manager.AddComponent(entity, ComponentType.ReadWrite<EcsTestData>());
Assert.AreEqual(0, m_Manager.GetComponentData<EcsTestData>(entity).value);
m_Manager.DestroyEntity(dummyEntity);
m_Manager.DestroyEntity(entity);
}
[Test]
public void ReadOnlyAndNonReadOnlyArchetypeAreEqual()
{
var arch = m_Manager.CreateArchetype(ComponentType.ReadOnly(typeof(EcsTestData)));
var arch2 = m_Manager.CreateArchetype(typeof(EcsTestData));
Assert.AreEqual(arch, arch2);
}
[Test]
public void ExcludeArchetypeReactToAddRemoveComponent()
{
var subtractiveArch = m_Manager.CreateEntityQuery(ComponentType.Exclude(typeof(EcsTestData)), typeof(EcsTestData2));
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData), typeof(EcsTestData2));
var entity = m_Manager.CreateEntity(archetype);
Assert.AreEqual(0, subtractiveArch.CalculateLength());
m_Manager.RemoveComponent<EcsTestData>(entity);
Assert.AreEqual(1, subtractiveArch.CalculateLength());
m_Manager.AddComponentData<EcsTestData>(entity, new EcsTestData());
Assert.AreEqual(0, subtractiveArch.CalculateLength());
}
[Test]
public void ChunkCountsAreCorrect()
{
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData));
var entity = m_Manager.CreateEntity(archetype);
Assert.AreEqual(1, archetype.ChunkCount);
m_Manager.AddComponent(entity, typeof(EcsTestData2));
Assert.AreEqual(0, archetype.ChunkCount);
unsafe {
Assert.IsTrue(archetype.Archetype->Chunks.Count == 0);
Assert.AreEqual(0, archetype.Archetype->EntityCount);
var archetype2 = m_Manager.EntityComponentStore->GetArchetype(entity);
Assert.AreEqual(1, archetype2->Chunks.Count);
Assert.AreEqual(1, archetype2->EntityCount);
}
}
[Test]
public void AddComponentsWorks()
{
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData));
var entity = m_Manager.CreateEntity(archetype);
// Create dummy archetype with unrelated type to override the internal cache in the entity manager
// This exposed a bug in AddComponent
m_Manager.CreateArchetype(typeof(EcsTestData4));
var typesToAdd = new ComponentTypes(new ComponentType[] {typeof(EcsTestData3), typeof(EcsTestData2)});
m_Manager.AddComponents(entity, typesToAdd);
var expectedTotalTypes = new ComponentTypes(new ComponentType[] {typeof(EcsTestData2), typeof(EcsTestData3), typeof(EcsTestData)});
var actualTotalTypes = m_Manager.GetComponentTypes(entity);
Assert.AreEqual(expectedTotalTypes.Length, actualTotalTypes.Length);
for (var i = 0; i < expectedTotalTypes.Length; ++i)
Assert.AreEqual(expectedTotalTypes.GetTypeIndex(i), actualTotalTypes[i].TypeIndex);
actualTotalTypes.Dispose();
}
[Test]
public void GetAllEntitiesCorrectCount()
{
var archetype0 = m_Manager.CreateArchetype(typeof(EcsTestData));
var entity = m_Manager.CreateEntity(archetype0);
var archetype1 = m_Manager.CreateArchetype(typeof(EcsTestData), typeof(EcsTestData2));
var moreEntities = new NativeArray<Entity>(1024,Allocator.Temp);
m_Manager.CreateEntity(archetype1, moreEntities);
var foundEntities = m_Manager.GetAllEntities();
Assert.AreEqual(1024+1,foundEntities.Length);
foundEntities.Dispose();
moreEntities.Dispose();
}
[Test]
public void GetAllEntitiesCorrectValues()
{
var archetype0 = m_Manager.CreateArchetype(typeof(EcsTestData));
var entity = m_Manager.CreateEntity(archetype0);
m_Manager.SetComponentData(entity,new EcsTestData { value = 1000000});
var archetype1 = m_Manager.CreateArchetype(typeof(EcsTestData), typeof(EcsTestData2));
var moreEntities = new NativeArray<Entity>(1024,Allocator.Temp);
m_Manager.CreateEntity(archetype1, moreEntities);
for (int i = 0; i < 1024; i++)
{
m_Manager.SetComponentData(moreEntities[i],new EcsTestData { value = i+1});
}
var foundEntities = m_Manager.GetAllEntities();
Assert.AreEqual(1025, foundEntities.Length);
var sum = 0;
var expectedSum = 1524800;
for (int i = 0; i < 1025; i++)
{
sum += m_Manager.GetComponentData<EcsTestData>(foundEntities[i]).value;
}
Assert.AreEqual(expectedSum, sum);
foundEntities.Dispose();
moreEntities.Dispose();
}
[Test]
public void AddComponentsWithTypeIndicesWorks()
{
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData));
var entity = m_Manager.CreateEntity(archetype);
var typesToAdd = new ComponentTypes(typeof(EcsTestData3), typeof(EcsTestData2));
m_Manager.AddComponents(entity, typesToAdd);
var expectedTotalTypes = new ComponentTypes(typeof(EcsTestData2), typeof(EcsTestData3), typeof(EcsTestData));
var actualTotalTypes = m_Manager.GetComponentTypes(entity);
Assert.AreEqual(expectedTotalTypes.Length, actualTotalTypes.Length);
for (var i = 0; i < expectedTotalTypes.Length; ++i)
Assert.AreEqual(expectedTotalTypes.GetTypeIndex(i), actualTotalTypes[i].TypeIndex);
actualTotalTypes.Dispose();
}
[Test]
public void AddComponentsWithSharedComponentsWorks()
{
var archetype = m_Manager.CreateArchetype(typeof(EcsTestData), typeof(EcsTestSharedComp));
var entity = m_Manager.CreateEntity(archetype);
var sharedComponentValue = new EcsTestSharedComp(1337);
m_Manager.SetSharedComponentData(entity, sharedComponentValue);
var typesToAdd = new ComponentTypes(typeof(EcsTestData3), typeof(EcsTestSharedComp2), typeof(EcsTestData2));
m_Manager.AddComponents(entity, typesToAdd);
Assert.AreEqual(m_Manager.GetSharedComponentData<EcsTestSharedComp>(entity), sharedComponentValue);
var expectedTotalTypes = new ComponentTypes(typeof(EcsTestData), typeof(EcsTestData2),
typeof(EcsTestData3), typeof(EcsTestSharedComp), typeof(EcsTestSharedComp2));
var actualTotalTypes = m_Manager.GetComponentTypes(entity);
Assert.AreEqual(expectedTotalTypes.Length, actualTotalTypes.Length);
for (var i = 0; i < expectedTotalTypes.Length; ++i)
Assert.AreEqual(expectedTotalTypes.GetTypeIndex(i), actualTotalTypes[i].TypeIndex);
actualTotalTypes.Dispose();
}
[Test]
public void InstantiateWithSystemStateComponent()
{
for (int i = 0; i < 1000; ++i)
{
var src = m_Manager.CreateEntity(typeof(EcsTestData), typeof(EcsState1), typeof(EcsTestData2));
m_Manager.SetComponentData(src, new EcsTestData {value = i * 123});
m_Manager.SetComponentData(src, new EcsTestData2 {value0 = i * 456, value1 = i * 789});
var dst = m_Manager.Instantiate(src);
Assert.AreEqual(i * 123, m_Manager.GetComponentData<EcsTestData>(dst).value);
Assert.AreEqual(i * 456, m_Manager.GetComponentData<EcsTestData2>(dst).value0);
Assert.AreEqual(i * 789, m_Manager.GetComponentData<EcsTestData2>(dst).value1);
Assert.IsFalse(m_Manager.HasComponent<EcsState1>(dst));
}
}
[TypeManager.ForcedMemoryOrderingAttribute(2)]
struct EcsSharedForcedOrder : ISharedComponentData
{
public int Value;
public EcsSharedForcedOrder(int value)
{
Value = value;
}
}
[TypeManager.ForcedMemoryOrderingAttribute(1)]
struct EcsSharedStateForcedOrder : ISystemStateSharedComponentData
{
public int Value;
public EcsSharedStateForcedOrder(int value)
{
Value = value;
}
}
[Test]
public void InstantiateWithSharedSystemStateComponent()
{
var srcEntity = m_Manager.CreateEntity();
var sharedValue = new EcsSharedForcedOrder(123);
var systemValue = new EcsSharedStateForcedOrder(234);
m_Manager.AddSharedComponentData(srcEntity, sharedValue);
m_Manager.AddSharedComponentData(srcEntity, systemValue);
var versionSharedBefore = m_Manager.GetSharedComponentOrderVersion(sharedValue);
var versionSystemBefore = m_Manager.GetSharedComponentOrderVersion(systemValue);
var dstEntity = m_Manager.Instantiate(srcEntity);
var sharedValueCopied = m_Manager.GetSharedComponentData<EcsSharedForcedOrder>(dstEntity);
var versionSharedAfter = m_Manager.GetSharedComponentOrderVersion(sharedValue);
var versionSystemAfter = m_Manager.GetSharedComponentOrderVersion(systemValue);
Assert.IsTrue(m_Manager.HasComponent<EcsSharedForcedOrder>(dstEntity));
Assert.IsFalse(m_Manager.HasComponent<EcsSharedStateForcedOrder>(dstEntity));
Assert.AreEqual(sharedValue, sharedValueCopied);
Assert.AreNotEqual(versionSharedBefore, versionSharedAfter);
Assert.AreEqual(versionSystemBefore, versionSystemAfter);
}
[Test]
public void AddTagComponentTwiceByValue()
{
var entity = m_Manager.CreateEntity();
m_Manager.AddComponentData(entity, new EcsTestTag());
m_Manager.AddComponentData(entity, new EcsTestTag());
}
[Test]
public void AddTagComponentTwiceByType()
{
var entity = m_Manager.CreateEntity();
m_Manager.AddComponent(entity, ComponentType.ReadWrite<EcsTestTag>());
m_Manager.AddComponent(entity, ComponentType.ReadWrite<EcsTestTag>());
}
[Test]
public void AddTagComponentTwiceToGroup()
{
m_Manager.CreateEntity();
m_Manager.AddComponent(m_Manager.UniversalQuery, ComponentType.ReadWrite<EcsTestTag>());
Assert.Throws<ArgumentException>(() => m_Manager.AddComponent(m_Manager.UniversalQuery, ComponentType.ReadWrite<EcsTestTag>()));
// Failure because the component type is expected to be explicitly excluded from the group.
}
#if !UNITY_DOTSPLAYER //Alert, this test is red in dots-runtime 32bit. looks like a legit scray bug.
[Test]
public void AddTagComponentTwiceByTypeArray()
{
var entity = m_Manager.CreateEntity();
m_Manager.AddComponents(entity, new ComponentTypes(ComponentType.ReadWrite<EcsTestTag>()));
m_Manager.AddComponents(entity, new ComponentTypes(ComponentType.ReadWrite<EcsTestTag>()));
m_Manager.AddComponents(entity, new ComponentTypes(ComponentType.ReadWrite<EcsTestData>()));
Assert.Throws<ArgumentException>(() => m_Manager.AddComponents(entity, new ComponentTypes(ComponentType.ReadWrite<EcsTestData>())));
}
#endif
[Test]
public void AddChunkComponentTwice()
{
var entity = m_Manager.CreateEntity();
m_Manager.AddChunkComponentData<EcsTestTag>(entity);
m_Manager.AddChunkComponentData<EcsTestTag>(entity);
m_Manager.AddChunkComponentData<EcsTestData>(entity);
m_Manager.AddChunkComponentData<EcsTestData>(entity);
}
[Test]
public void AddChunkComponentToGroupTwice()
{
m_Manager.CreateEntity();
m_Manager.AddChunkComponentData(m_Manager.UniversalQuery, new EcsTestTag());
Assert.Throws<ArgumentException>(() => m_Manager.AddChunkComponentData(m_Manager.UniversalQuery, new EcsTestTag()));
m_Manager.AddChunkComponentData(m_Manager.UniversalQuery, new EcsTestData{value = 123});
Assert.Throws<ArgumentException>(() => m_Manager.AddChunkComponentData(m_Manager.UniversalQuery, new EcsTestData{value = 123}));
Assert.Throws<ArgumentException>(() => m_Manager.AddChunkComponentData(m_Manager.UniversalQuery, new EcsTestData{value = 456}));
}
[Test]
public void AddSharedComponentTwice()
{
var entity = m_Manager.CreateEntity();
m_Manager.AddSharedComponentData(entity, new EcsTestSharedComp());
Assert.Throws<ArgumentException>(() => m_Manager.AddSharedComponentData(entity, new EcsTestSharedComp()));
}
[Test]
public void AddComponentTagTwiceWithEntityArray()
{
var entities = new NativeArray<Entity>(3, Allocator.TempJob);
entities[0] = m_Manager.CreateEntity();
entities[1] = m_Manager.CreateEntity(typeof(EcsTestTag));
entities[2] = m_Manager.CreateEntity(typeof(EcsTestTag), typeof(EcsTestData2));
m_Manager.AddComponent(entities, typeof(EcsTestTag));
Assert.IsTrue(m_Manager.HasComponent<EcsTestTag>(entities[0]));
Assert.IsTrue(m_Manager.HasComponent<EcsTestTag>(entities[1]));
Assert.IsTrue(m_Manager.HasComponent<EcsTestTag>(entities[2]));
entities.Dispose();
}
[Test]
public void AddComponentTwiceWithEntityCommandBuffer()
{
using(var ecb = new EntityCommandBuffer(Allocator.TempJob))
{
var entity = ecb.CreateEntity();
ecb.AddComponent(entity, new EcsTestTag());
ecb.AddComponent(entity, new EcsTestTag());
Assert.DoesNotThrow(() => ecb.Playback(m_Manager));
}
// without fixup
using(var ecb = new EntityCommandBuffer(Allocator.TempJob))
{
var entity = ecb.CreateEntity();
ecb.AddComponent(entity, new EcsTestData());
ecb.AddComponent(entity, new EcsTestData());
Assert.Throws<ArgumentException>(() => ecb.Playback(m_Manager));
}
// with fixup
using(var ecb = new EntityCommandBuffer(Allocator.TempJob))
{
var entity = ecb.CreateEntity();
var other = ecb.CreateEntity();
ecb.AddComponent(entity, new EcsTestDataEntity{ value1 = other });
ecb.AddComponent(entity, new EcsTestDataEntity{ value1 = other });
Assert.Throws<ArgumentException>(() => ecb.Playback(m_Manager));
}
}
[Test]
public void AddBufferComponentTwice()
{
var entity = m_Manager.CreateEntity();
m_Manager.AddBuffer<EcsIntElement>(entity);
Assert.DoesNotThrow(() => m_Manager.AddBuffer<EcsIntElement>(entity));
}
[Test]
public void DestroyEntityQueryWithLinkedEntityGroupPartialDestroyThrows()
{
var entity = m_Manager.CreateEntity(typeof(EcsTestTag));
var child = m_Manager.CreateEntity(typeof(EcsTestData2));
var group = m_Manager.AddBuffer<LinkedEntityGroup>(entity);
group.Add(entity);
group.Add(child);
var query = m_Manager.CreateEntityQuery(typeof(EcsTestTag));
// we are destroying entity but it has a LinkedEntityGroup and child is not being destroyed. That's an error.
Assert.Throws<ArgumentException>(() => m_Manager.DestroyEntity(query));
// Just double checking that its a precondition & no leaking state
Assert.Throws<ArgumentException>(() => m_Manager.DestroyEntity(query));
Assert.AreEqual(2, m_Manager.UniversalQuery.CalculateLength());
// And after failed destroy, correct destroys do work
m_Manager.DestroyEntity(m_Manager.UniversalQuery);
Assert.AreEqual(0, m_Manager.UniversalQuery.CalculateLength());
}
}
}