孙广东 2018.5.20
using
UnityEngine
;
public class
Counter
:
MonoBehaviour
{
public int
count
;
void
Update
() {
count
++
; }}
|
using Unity.Entities;
// 实体
public struct CountData : IComponentData
{
public int count;
}
|
using Unity.Entities;
public class CountSystem : ComponentSystem
{
// System所需的ComponentData列表
struct Group
{
public int Length;
public ComponentDataArray
}
[Inject] Group group; // 注入请求的ComponentData
// 调用每一帧
protected override void OnUpdate()
{
for(int i=0; i
{
var countData = group.countData[i];
countData.count++;
group.countData[i] = countData;
}
}
}
|
using UnityEngine;
using Unity.Entities;
public class ECSMain : MonoBehaviour
{
void Start ()
{
// 获取EntityManager
var entityManager = World.Active.GetOrCreateManager
// 定义实体的原型
var sampleArchetype = entityManager.CreateArchetype(typeof(CountData));
// 实际上基于原型生成实体
entityManager.CreateEntity(sampleArchetype);
}
}
|
using Unity.Entities;
// 実体
public struct CountData : IComponentData
{
public int count;
}
[System.Serializable]
public struct RangeData : ISharedComponentData
{
public int min, max;
}
|
using UnityEngine;
using Unity.Entities;
using Unity.Collections;
public class ECSMain : MonoBehaviour
{
[SerializeField] RangeData range;
EntityArchetype sampleArchetype;
void Start()
{
var entityManager = World.Active.GetOrCreateManager
sampleArchetype = entityManager.CreateArchetype(typeof(CountData), typeof(RangeData));
}
private void Update()
{
if(Input.anyKey)
{
var entityManager = World.Active.GetOrCreateManager
var entity = entityManager.CreateEntity(sampleArchetype);
entityManager.SetSharedComponentData
}
}
}
|
using Unity.Entities;
using Unity.Collections;
using Unity.Jobs;
[UpdateAfter(typeof(CountSystem))]
public class RangeSystem : ComponentSystem
{
struct Group
{
public int Length;
public EntityArray entities;
[ReadOnly] public ComponentDataArray
[ReadOnly] public SharedComponentDataArray
}
[Inject] Group group;
protected override void OnUpdate()
{
for (int i=0; i
{
var range = group.rangeData[i];
var data = group.countData[i];
if ( data.count > range.max || data.count < range.min )
{
PostUpdateCommands.DestroyEntity(group.entities[i]);
}
}
}
}
|
using Unity.Entities;
using Unity.Jobs;
public class CountSystem : JobComponentSystem
{
AddCounterJob job;
protected override void OnCreateManager(int capacity)
{
base.OnCreateManager(capacity);
// 做一份工作
job = new AddCounterJob();
}
// 发布工作
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
return job.Schedule(this, 64, inputDeps);
}
[ComputeJobOptimization] // Burst编译器的优化属性
struct AddCounterJob : IJobProcessComponentData
{
public void Execute(ref CountData data)
{
data.count++;
}
}
}
|