官方的第一个Demo是ForEach,演示了最基础的ECS游戏(旁白:等等,你管这叫做游戏?) 这一篇,我们抛开所有的理论知识,先让大家把一个最简单的ECS游戏…唔,程序,跑起来。
首先,我们要安装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版本,所以上面的截图版本号不准确。
ECS是什么?上一篇说过了:实体(Entity)、组件(Component)、系统(System)。 官方Demo的第一个例子是制作一个旋转的正方体,简单地展示了ECS的基本模式。
首先创建一个场景,然后新建一个结构体:
using Unity.Entities;
[GenerateAuthoringComponent]
public struct RotationSpeed_ForEach : IComponentData
{
public float RadiansPerSecond;
}
RotationSpeed_ForEach继承了IComponentData接口,这是ECS的组件接口。
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;
/* 旋转Cube,代码逻辑不用管,这里可以是其他任何逻辑 */
rotation.Value = math.mul(math.normalize(rotation.Value),
quaternion.AxisAngle(math.up(), rotationSpeed.RadiansPerSecond * deltaTime));
});
}
}
继承了JobComponentSystem的类,就是System,看起来有点复杂(官方原本的Demo更复杂,我简化了),先别慌,照抄就是了。
等等,为什么实体要放在最后? 因为实体有点特别,我们先创建一个Cube:
现在,把RotationSpeed_ForEach(组件)拖到Cube上:
唔,我还偷偷添加了一个【ConvertToEntity】组件,这个也是必须的。 这样的话,我们的Cube就会被自动转换为ECS的实体,并且这个实体拥有RotationSpeed_ForEach组件。 很神奇是不是? 将GameObject转换为ESC中的实体的方式不止一种,以后我们会慢慢讲到。
不管任何原理,现在,运行程序,看看是不是有一个Cube在不断旋转。 好了,本篇到此结束,下一篇我们仍然使用同样的代码,然后把基础的概念给大家解释一下。
注意,本系列教程基于DOTS相关预览版的Package包,是预览版,不代表正式版的时候也适用。 转发本系列文章的朋友请注意,带上原文链接和原文日期,避免误导未来使用正式版的开发者。