您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
317 行
9.3 KiB
317 行
9.3 KiB
using NUnit.Framework;
|
|
using System;
|
|
using Unity.Collections;
|
|
using Unity.Entities;
|
|
using Unity.Jobs;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.Entities.Tests
|
|
{
|
|
public class InjectComponentGroupTests : ECSTestsFixture
|
|
{
|
|
[DisableAutoCreation]
|
|
[AlwaysUpdateSystem]
|
|
public class PureEcsTestSystem : ComponentSystem
|
|
{
|
|
public struct DataAndEntites
|
|
{
|
|
public ComponentDataArray<EcsTestData> Data;
|
|
public EntityArray Entities;
|
|
public readonly int Length;
|
|
}
|
|
|
|
[Inject]
|
|
public DataAndEntites Group;
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
[AlwaysUpdateSystem]
|
|
public class PureReadOnlySystem : ComponentSystem
|
|
{
|
|
public struct Datas
|
|
{
|
|
[ReadOnly]
|
|
public ComponentDataArray<EcsTestData> Data;
|
|
}
|
|
|
|
[Inject]
|
|
public Datas Group;
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public struct SharedData : ISharedComponentData
|
|
{
|
|
public int value;
|
|
|
|
public SharedData(int val) { value = val; }
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
[AlwaysUpdateSystem]
|
|
public class SharedComponentSystem : ComponentSystem
|
|
{
|
|
public struct Datas
|
|
{
|
|
public ComponentDataArray<EcsTestData> Data;
|
|
[ReadOnly] public SharedComponentDataArray<SharedData> SharedData;
|
|
}
|
|
|
|
[Inject]
|
|
public Datas Group;
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
[AlwaysUpdateSystem]
|
|
public class ComponentGroupAsPartOfInjectedGroupSystem : ComponentSystem
|
|
{
|
|
public struct GroupStruct0
|
|
{
|
|
public ComponentDataArray<EcsTestData> Data;
|
|
public ComponentDataArray<EcsTestData2> Data2;
|
|
public readonly int GroupIndex;
|
|
}
|
|
|
|
public struct GroupStruct1
|
|
{
|
|
public ComponentDataArray<EcsTestData> Data;
|
|
[ReadOnly] public SharedComponentDataArray<EcsTestSharedComp> Shared;
|
|
public readonly int GroupIndex;
|
|
}
|
|
|
|
[Inject]
|
|
public GroupStruct0 Group0;
|
|
[Inject]
|
|
public GroupStruct1 Group1;
|
|
|
|
protected override void OnCreateManager(int capacity)
|
|
{
|
|
ComponentGroups[Group1.GroupIndex].SetFilter(new EcsTestSharedComp(123));
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void ComponentGroupFromInjectedGroup()
|
|
{
|
|
var system = World.GetOrCreateManager<ComponentGroupAsPartOfInjectedGroupSystem>();
|
|
|
|
var entity0 = m_Manager.CreateEntity(typeof(EcsTestData), typeof(EcsTestSharedComp), typeof(EcsTestData2));
|
|
var entity1 = m_Manager.CreateEntity(typeof(EcsTestData), typeof(EcsTestSharedComp));
|
|
var entity2 = m_Manager.CreateEntity(typeof(EcsTestData), typeof(EcsTestSharedComp));
|
|
|
|
m_Manager.SetSharedComponentData(entity0, new EcsTestSharedComp(123));
|
|
m_Manager.SetSharedComponentData(entity1, new EcsTestSharedComp(456));
|
|
m_Manager.SetSharedComponentData(entity2, new EcsTestSharedComp(123));
|
|
|
|
var group0 = system.ComponentGroups[system.Group0.GroupIndex];
|
|
var group1 = system.ComponentGroups[system.Group1.GroupIndex];
|
|
|
|
var data0 = group0.GetComponentDataArray<EcsTestData>();
|
|
var data1 = group1.GetComponentDataArray<EcsTestData>();
|
|
|
|
Assert.AreEqual(1, data0.Length);
|
|
Assert.AreEqual(2, data1.Length);
|
|
}
|
|
|
|
[Test]
|
|
public void ReadOnlyComponentDataArray()
|
|
{
|
|
var readOnlySystem = World.GetOrCreateManager<PureReadOnlySystem> ();
|
|
|
|
var go = m_Manager.CreateEntity (new ComponentType[0]);
|
|
m_Manager.AddComponentData (go, new EcsTestData(2));
|
|
|
|
readOnlySystem.Update ();
|
|
Assert.AreEqual (2, readOnlySystem.Group.Data[0].value);
|
|
Assert.Throws<System.InvalidOperationException>(()=> { readOnlySystem.Group.Data[0] = new EcsTestData(); });
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
public void SharedComponentDataArray()
|
|
{
|
|
var sharedComponentSystem = World.GetOrCreateManager<SharedComponentSystem> ();
|
|
|
|
var go = m_Manager.CreateEntity(new ComponentType[0]);
|
|
m_Manager.AddComponentData (go, new EcsTestData(2));
|
|
m_Manager.AddSharedComponentData(go, new SharedData(3));
|
|
|
|
sharedComponentSystem.Update ();
|
|
Assert.AreEqual (1, sharedComponentSystem.Group.Data.Length);
|
|
Assert.AreEqual (2, sharedComponentSystem.Group.Data[0].value);
|
|
Assert.AreEqual (3, sharedComponentSystem.Group.SharedData[0].value);
|
|
}
|
|
|
|
|
|
[Test]
|
|
public void RemoveComponentGroupTracking()
|
|
{
|
|
var pureSystem = World.GetOrCreateManager<PureEcsTestSystem> ();
|
|
|
|
var go0 = m_Manager.CreateEntity (new ComponentType[0]);
|
|
m_Manager.AddComponentData (go0, new EcsTestData(10));
|
|
|
|
var go1 = m_Manager.CreateEntity ();
|
|
m_Manager.AddComponentData (go1, new EcsTestData(20));
|
|
|
|
pureSystem.Update ();
|
|
Assert.AreEqual (2, pureSystem.Group.Length);
|
|
Assert.AreEqual (10, pureSystem.Group.Data[0].value);
|
|
Assert.AreEqual (20, pureSystem.Group.Data[1].value);
|
|
|
|
m_Manager.RemoveComponent<EcsTestData> (go0);
|
|
|
|
pureSystem.Update ();
|
|
Assert.AreEqual (1, pureSystem.Group.Length);
|
|
Assert.AreEqual (20, pureSystem.Group.Data[0].value);
|
|
|
|
m_Manager.RemoveComponent<EcsTestData> (go1);
|
|
pureSystem.Update ();
|
|
Assert.AreEqual (0, pureSystem.Group.Length);
|
|
}
|
|
|
|
[Test]
|
|
public void EntityGroupTracking()
|
|
{
|
|
var pureSystem = World.GetOrCreateManager<PureEcsTestSystem> ();
|
|
|
|
var go = m_Manager.CreateEntity (new ComponentType[0]);
|
|
m_Manager.AddComponentData (go, new EcsTestData(2));
|
|
|
|
pureSystem.Update ();
|
|
Assert.AreEqual (1, pureSystem.Group.Length);
|
|
Assert.AreEqual (1, pureSystem.Group.Data.Length);
|
|
Assert.AreEqual (1, pureSystem.Group.Entities.Length);
|
|
Assert.AreEqual (2, pureSystem.Group.Data[0].value);
|
|
Assert.AreEqual (go, pureSystem.Group.Entities[0]);
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
public class FromEntitySystemIncrementInJob : JobComponentSystem
|
|
{
|
|
public struct IncrementValueJob : IJob
|
|
{
|
|
public Entity entity;
|
|
|
|
public ComponentDataFromEntity<EcsTestData> ecsTestDataFromEntity;
|
|
public BufferFromEntity<EcsIntElement> intArrayFromEntity;
|
|
|
|
public void Execute()
|
|
{
|
|
DynamicBuffer<EcsIntElement> array = intArrayFromEntity[entity];
|
|
for (int i = 0; i < array.Length; i++)
|
|
array[i] = new EcsIntElement { Value = array[i].Value + 1 };
|
|
|
|
var value = ecsTestDataFromEntity[entity];
|
|
value.value++;
|
|
ecsTestDataFromEntity[entity] = value;
|
|
}
|
|
}
|
|
|
|
[Inject]
|
|
BufferFromEntity<EcsIntElement> intArrayFromEntity;
|
|
|
|
[Inject]
|
|
ComponentDataFromEntity<EcsTestData> ecsTestDataFromEntity;
|
|
|
|
public Entity entity;
|
|
|
|
protected override JobHandle OnUpdate(JobHandle inputDeps)
|
|
{
|
|
var job = new IncrementValueJob();
|
|
job.entity = entity;
|
|
job.ecsTestDataFromEntity = ecsTestDataFromEntity;
|
|
job.intArrayFromEntity = intArrayFromEntity;
|
|
|
|
return job.Schedule(inputDeps);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void FromEntitySystemIncrementInJobWorks()
|
|
{
|
|
var system = World.GetOrCreateManager<FromEntitySystemIncrementInJob>();
|
|
|
|
var entity = m_Manager.CreateEntity(typeof(EcsTestData), typeof(EcsIntElement));
|
|
|
|
m_Manager.GetBuffer<EcsIntElement>(entity).CopyFrom(new EcsIntElement[] { 0, -1, Int32.MinValue });
|
|
|
|
system.entity = entity;
|
|
system.Update();
|
|
system.Update();
|
|
|
|
Assert.AreEqual(2, m_Manager.GetComponentData<EcsTestData>(entity).value);
|
|
Assert.AreEqual(2, m_Manager.GetBuffer<EcsIntElement>(entity)[0].Value);
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
public class OnCreateManagerComponentGroupInjectionSystem : JobComponentSystem
|
|
{
|
|
public struct Group
|
|
{
|
|
public ComponentDataArray<EcsTestData> Data;
|
|
}
|
|
|
|
[Inject]
|
|
public Group group;
|
|
|
|
protected override void OnCreateManager(int capacity)
|
|
{
|
|
Assert.AreEqual(1, group.Data.Length);
|
|
Assert.AreEqual(42, group.Data[0].value);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void OnCreateManagerComponentGroupInjectionWorks()
|
|
{
|
|
var entity = m_Manager.CreateEntity (typeof(EcsTestData));
|
|
m_Manager.SetComponentData(entity, new EcsTestData(42));
|
|
World.GetOrCreateManager<OnCreateManagerComponentGroupInjectionSystem>();
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
public class OnDestroyManagerComponentGroupInjectionSystem : JobComponentSystem
|
|
{
|
|
public struct Group
|
|
{
|
|
public ComponentDataArray<EcsTestData> Data;
|
|
}
|
|
|
|
[Inject]
|
|
public Group group;
|
|
|
|
protected override void OnDestroyManager()
|
|
{
|
|
Assert.AreEqual(1, group.Data.Length);
|
|
Assert.AreEqual(42, group.Data[0].value);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void OnDestroyManagerComponentGroupInjectionWorks()
|
|
{
|
|
var system = World.GetOrCreateManager<OnDestroyManagerComponentGroupInjectionSystem>();
|
|
var entity = m_Manager.CreateEntity (typeof(EcsTestData));
|
|
m_Manager.SetComponentData(entity, new EcsTestData(42));
|
|
World.DestroyManager(system);
|
|
}
|
|
}
|
|
}
|