官方的第一个Demo是ForEach,演示了最基础的ECS游戏(旁白:等等,你管这叫做游戏?)
这一篇,我们抛开所有的理论知识,先让大家把一个最简单的ECS游戏…唔,程序,跑起来。
1.安装Entities包
首先,我们要安装Entities包和Hybrid Renderer包,这样才能支持ECS模式的开发。
打开Unity的Window->PackageManager菜单,搜一下Entities,记住,要把筛选条件改为All packages:
编写本系列教程时,我使用的Entities是0.3.0版本(预览版)。
安装完Entities后,接着安装Hybrid Renderer包,仍然是0.3.0。
注:在我写教程的时候,ECS相关的包只更新到0.2.0版本,后来更新到0.3.0版本,所以上面的截图版本号不准确。
2.概念(说好的抛开所有理论知识呢?)
ECS是什么?上一篇说过了:实体(Entity)、组件(Component)、系统(System)。
官方Demo的第一个例子是制作一个旋转的正方体,简单地展示了ECS的基本模式。
3.组件(Component)
首先创建一个场景,然后新建一个结构体:
using Unity.Entities;
[GenerateAuthoringComponent]
public struct RotationSpeed_ForEach : IComponentData
{
public float RadiansPerSecond;
}
1
2
3
4
5
6
7
usingUnity.Entities;
[GenerateAuthoringComponent]
publicstructRotationSpeed_ForEach:IComponentData
{
publicfloatRadiansPerSecond;
}
RotationSpeed_ForEach继承了IComponentData接口,这是ECS的组件接口。
4.系统(System)
ECS的System是用于处理逻辑的,整个游戏中,可能会存在很多很多的System。
我们现在就来创建一个用于管理Cube旋转逻辑的System,创建一个新的类
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Transforms;
// This system updates all entities in the scene with both a RotationSpeed_ForEach and Rotation component.
public class RotationSpeedSystem_ForEach : ComponentSystem
{
protected override void OnUpdate ()
{
Entities.ForEach((ref RotationSpeed_ForEach rotationSpeed, ref Rotation rotation) =>
{
var deltaTime = Time.DeltaTime;
rotation.Value = math.mul(math.normalize(rotation.Value),
quaternion.AxisAngle(math.up(), rotationSpeed.RadiansPerSecond * deltaTime));
});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
usingUnity.Entities;
usingUnity.Jobs;
usingUnity.Mathematics;
usingUnity.Transforms;
// This system updates all entities in the scene with both a RotationSpeed_ForEach and Rotation component.
publicclassRotationSpeedSystem_ForEach:ComponentSystem
{
protectedoverridevoidOnUpdate()
{
Entities.ForEach((refRotationSpeed_ForEachrotationSpeed,refRotationrotation)=>
{
vardeltaTime=Time.DeltaTime;
rotation.Value=math.mul(math.normalize(rotation.Value),
quaternion.AxisAngle(math.up(),rotationSpeed.RadiansPerSecond*deltaTime));
});
}
}
继承了JobComponentSystem的类,就是System,看起来有点复杂(官方原本的Demo更复杂,我简化了),先别慌,照抄就是了。
5.创建实体
等等,为什么实体要放在最后?
因为实体有点特别,我们先创建一个Cube:
现在,把RotationSpeed_ForEach(组件)拖到Cube上:
唔,我还偷偷添加了一个【ConvertToEntity】组件,这个也是必须的。
这样的话,我们的Cube就会被自动转换为ECS的实体,并且这个实体拥有RotationSpeed_ForEach组件。
很神奇是不是?
将GameObject转换为ESC中的实体的方式不止一种,以后我们会慢慢讲到。
8.运行
不管任何原理,现在,运行程序,看看是不是有一个Cube在不断旋转。
好了,本篇到此结束,下一篇我们仍然使用同样的代码,然后把基础的概念给大家解释一下。
注意,本系列教程基于DOTS相关预览版的Package包,是预览版,不代表正式版的时候也适用。
转发本系列文章的朋友请注意,带上原文链接和原文日期,避免误导未来使用正式版的开发者。