Unity_Dots-ECS_001
0.0准备工作
0.1 导入Package
- Entitis(v0.11.2)
- Burst(v1.3.0)
- Jobs(v0.2.10)
- Mathematics(v1.1.0)
- Collections(v0.9.0)
- HybridRenderer(v0.5.2)
1.0 创建基本ECS结构
1.1生成Entity
Testing.cs
using UnityEngine;
using Unity.Entities;
public class Testing : MonoBehaviour
{
private void Start()
{
EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;
Entity entity = eM.CreateEntity(typeof(LevelComponent));
eM.SetComponentData(entity, new LevelComponent { level = 10 });
}
}
1.2 创建Component
LevelComponent.cs
using Unity.Entities;
public struct LevelComponent : IComponentData
{
public float level;
}
运行效果
1.3 创建System
LevelUpSystem.cs
using UnityEngine;
using Unity.Entities;
public class LevelUpSystem : ComponentSystem
{
protected override void OnUpdate()
{
Entities.ForEach((ref LevelComponent levelComponent) =>
{
levelComponent.level += 1f * Time.DeltaTime;
Debug.Log(levelComponent.level);
});
}
}
运行效果
2.0 Component
2.1 添加多个Component
Testing.cs
- 生成一个具有两个Component的Entity
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
public class Testing : MonoBehaviour
{
private void Start()
{
EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;
EntityArchetype entityArchetype = eM.CreateArchetype(
typeof(LevelComponent),
typeof(Translation)
);
Entity entity = eM.CreateEntity(entityArchetype);
eM.SetComponentData(entity, new LevelComponent { level = 10 });
}
}
运行结果
2.2 生成2个Entity
Testing.cs
- 生成两个分别具有两个Component的Entity
- 两个Entity分别具有随机Level值
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;
public class Testing : MonoBehaviour
{
private void Start()
{
EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;
EntityArchetype entityArchetype = eM.CreateArchetype(
typeof(LevelComponent),
typeof(Translation)
);
NativeArray<Entity> entityArray = new NativeArray<Entity>(2, Allocator.Temp);
eM.CreateEntity(entityArchetype, entityArray);
for (int i = 0; i < entityArray.Length; i++)
{
Entity entity = entityArray[i];
eM.SetComponentData(entity, new LevelComponent { level = Random.Range(10, 20)});
}
entityArray.Dispose();
}
}
运行结果
2.3 生成2000个Entity
Testing.cs
- 将数组数量扩充到2000,注释掉LevelComponent中的Debug输出
NativeArray<Entity> entityArray = new NativeArray<Entity>(2000, Allocator.Temp);
运行结果
3.0 Render
3.1 渲染一个cube
- 添加
RenderMesh
和RenderBounds
- 将Array数量改成1
Testing.cs
using UnityEngine;
using Unity.Entities;
using Unity.Transforms;
using Unity.Collections;
using Unity.Rendering;
public class Testing : MonoBehaviour
{
[SerializeField] Mesh m_Mesh;
[SerializeField] Material m_Material;
private void Start()
{
EntityManager eM = World.DefaultGameObjectInjectionWorld.EntityManager;
EntityArchetype entityArchetype = eM.CreateArchetype(
typeof(LevelComponent),
typeof(Translation),
typeof(RenderMesh),
typeof(RenderBounds),
typeof(LocalToWorld)
);
NativeArray<Entity> entityArray = new NativeArray<Entity>(1, Allocator.Temp);
eM.CreateEntity(entityArchetype, entityArray);
for (int i = 0; i < entityArray.Length; i++)
{
Entity entity = entityArray[i];
eM.SetComponentData(entity, new LevelComponent { level = Random.Range(10, 20) });
eM.SetSharedComponentData(entity, new RenderMesh()
{
mesh = m_Mesh,
material = m_Material,
});
}
entityArray.Dispose();
}
}
运行结果
4.0 Translation
4.1 使物体向上平移
- 添加新的System用于移动物体
- 做法与LevelSystem类似
MoveSystem.cs
using Unity.Entities;
using Unity.Transforms;
public class MoveSystem : ComponentSystem
{
protected override void OnUpdate()
{
Entities.ForEach((ref Translation translation) =>
{
translation.Value.y += 1f * Time.DeltaTime;
});
}
}
运行结果
4.2 设置移动速度
- 创建控制移动的Component
- 做法与LevelComponent类似
MoveSpeedComponent.cs
using Unity.Entities;
public class MoveSpeedComponent : IComponentData
{
public float speed;
}