天天看点

unity要学ecs吗_[Unity ECS 入门]1.最简单的ECS程序

官方的第一个Demo是ForEach,演示了最基础的ECS游戏(旁白:等等,你管这叫做游戏?)

这一篇,我们抛开所有的理论知识,先让大家把一个最简单的ECS游戏…唔,程序,跑起来。

1.安装Entities包

首先,我们要安装Entities包和Hybrid Renderer包,这样才能支持ECS模式的开发。

打开Unity的Window->PackageManager菜单,搜一下Entities,记住,要把筛选条件改为All packages:

unity要学ecs吗_[Unity ECS 入门]1.最简单的ECS程序
unity要学ecs吗_[Unity ECS 入门]1.最简单的ECS程序

编写本系列教程时,我使用的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:

unity要学ecs吗_[Unity ECS 入门]1.最简单的ECS程序

现在,把RotationSpeed_ForEach(组件)拖到Cube上:

unity要学ecs吗_[Unity ECS 入门]1.最简单的ECS程序

唔,我还偷偷添加了一个【ConvertToEntity】组件,这个也是必须的。

这样的话,我们的Cube就会被自动转换为ECS的实体,并且这个实体拥有RotationSpeed_ForEach组件。

很神奇是不是?

将GameObject转换为ESC中的实体的方式不止一种,以后我们会慢慢讲到。

8.运行

不管任何原理,现在,运行程序,看看是不是有一个Cube在不断旋转。

好了,本篇到此结束,下一篇我们仍然使用同样的代码,然后把基础的概念给大家解释一下。

注意,本系列教程基于DOTS相关预览版的Package包,是预览版,不代表正式版的时候也适用。

转发本系列文章的朋友请注意,带上原文链接和原文日期,避免误导未来使用正式版的开发者。