将介绍如何在Unity上使用实体组件系统(通常称为ECS)。
这次的内容是Unity提供的ECS API的基本用法,一个小应用程序和并行化。
它不包括与Unity的GameObject / Component的合作,以及实际使用。
获取可以使用ECS的编辑器
Unity2018 和之后的版本都可以!
创建一个可以使用ECS的项目
要启用ECS,需要两件事。
- 使使用 .NET 4.x
- 重写 manifest.json
正常启动Unity并打开 Edit> PlayerSettings> PlayerSettings。
之后,将Scripting Runtime Version脚本运行时版本更改为Stable (.net 4.x)。
接下来是重写manifest.json。
由于在项目的Root文件夹/ Packages中有一个名为manifest.json的文件,因此我们将按照https://github.com/Unity-Technologies/EntityComponentSystemSamples/blob/master/TwoStickShooter/Pure/Packages/manifest.json 与此处相同的方式重写内容。
准备工作完成。
最小的ECS项目
首先,尝试尽可能地构建最有意义的功能。
这次要组织的功能就是这样
- 统计每个帧
1、 没有使用 ECS的代码 :
首先我会试着用MonoBehaviour来组织它。这是一个非常简单的代码。
编写完成后,您可以将Counter组件添加到适当的GameObject中。
using UnityEngine; public class Counter : MonoBehaviour{ public int count; void Update () { count++; }} |
接下来,让我们对应于ECS。有三件事要做
它是什么?麻烦? ECS就是这样
- CountData 计数的值
- CountSystem 实际计数
- ECSMain 实体
ComponentDatas.cs
using Unity.Entities;
// 实体 public struct CountData : IComponentData { public int count; } |
CountSystem.cs
using Unity.Entities;
public class CountSystem : ComponentSystem { // System所需的ComponentData列表 struct Group { public int Length; public ComponentDataArray<CountData> countData; }
[Inject] Group group; // 注入请求的ComponentData
// 调用每一帧 protected override void OnUpdate() { for(int i=0; i<group.Length; i++) { var countData = group.countData[i]; countData.count++; group.countData[i] = countData; } } } |
ECSMain.cs
using UnityEngine; using Unity.Entities;
public class ECSMain : MonoBehaviour { void Start () { // 获取EntityManager var entityManager = World.Active.GetOrCreateManager<EntityManager>();
// 定义实体的原型 var sampleArchetype = entityManager.CreateArchetype(typeof(CountData));
// 实际上基于原型生成实体 entityManager.CreateEntity(sampleArchetype); } } |
之后,如果您将ECSMain附加到适当的对象并Play,则第一步完成。
在Play期间,打开Window > EntityDebugger,当它从Systems列表中找到CountSystem时,它会变白,并且如果实体存在 。
如果没有实体,那么您有可能在没有CountData的情况下创建实体,或者您没有首先创建实体。另外,如果您没有系统,则创建ComponentSystem的代码有问题。
更多unity2018的功能介绍请到paws3d学习中心查找。链接https://www.paws3d.com/learn/,也可以加入unity学习讨论群935714213