网易首页 > 网易号 > 正文 申请入驻

ECS入门之Hello World

0
分享至

你好,我是跟着大智学Unity的萌新,我叫小新,最近在探索DOTS。

由于ECS概念过于复杂,还是看看如何Code吧, 咱们先来看下如何编写一个最简单的ECS代码。

ECS中的Hello World

这就又要从Hello World说起了。

首先需要把DOTS的环境搭好。本课程最开头讲了如何安装Entities包,如果还没安装好需要去复习一下。

DOTS开发101

这个Hello World需要做什么呢?咱们用ECS来控制一个Cube的旋转。

ECS咱们已经知道了分三个部分,咱们来看看这三个部分如何创建。

01E:在场景中创建一个Cube

按照和之前一样的方法,在场景中创建一个Cube物体。

但这样并不是ECS中的Entity,可以使用一个脚本[ConvertToEntity],将GameObject转换成Entity。

这个脚本有一个属性,ConversionMode:

Convert And Destroy:将GameObject转换成Entities,并且销毁GameObject。

Convert And Inject GameObject:将GameObject转换成Entities,保留GameObject。

咱们在这选择Convert And Destroy。

这样咱们就有了一个E,这时候如果你运行呢,你就会发现场景里有一个Cube,但是在Hierarchy中看不到这个Cube。

那如何查看这个Cube上面的信息呢?这时候需要使用Entity Debugger。打开方式是:Unity菜单栏

Window > Analysis > Entitiy Debugger

02C:创建Component

下面来创建Component,这个Component和原来MonoBehaviour继承的Component不是一个东西。

ECS中的Component需要使用一个结构体,实现[IComponentData]接口。

如下代码:

[GenerateAuthoringComponent]public struct RotationSpeed_ForEach : IComponentData{// 旋转的速度public float RadiansPerSecond;}

这个结构体中定义了一个float类型的数据,代表旋转速度。

那上面的那个[GenerateAuthoringComponent]是做什么的呢?

正常情况下,ECS中的Component并不能直接拖到物体上跟物体绑定。但是加了[GenerateAuthoringComponent]属性后,可以将这个Component拖到GameObject上,并在脚本[ConvertToEntity]转换时,自动将Component和转换出来的Entities绑定。

现在写好了就把这个RotationSpeed_ForEach组件添加到Cube上面吧。

03S:用System控制Cube旋转

using Unity.Entities;using Unity.Mathematics;using Unity.Transforms;
// 这个系统会更新所有拥有RotationSpeed_ForEach和Rotation组件的实体public class RotationSpeedSystem_ForEach : SystemBase{// OnUpdate在主线程上执行protected override void OnUpdate(){float deltaTime = Time.DeltaTime;
// 调度job来让cube进行旋转Entities.WithName("RotationSpeedSystem_ForEach").ForEach((ref Rotation rotation, in RotationSpeed_ForEach rotationSpeed) =>{rotation.Value = math.mul(math.normalize(rotation.Value),quaternion.AxisAngle(math.up(), rotationSpeed.RadiansPerSecond * deltaTime));}).ScheduleParallel();}}

右滑查看完整代码

首先注意命名空间的引用,在ECS中并没有引用比如[UnityEngine]这种在Mono中常见的命名空间。

通常引用的命名空间就是这三个:

using Unity.Entities;

using Unity.Mathematics;

using Unity.Transforms;

实现一个class,继承SystemBase,然后重写父类SystemBase里的[OnUpdate]方法。

[OnUpdate] 方法和Mono中的Update方法类似,都是每帧执行一次,然们可以在里面做更新的操作。

以下代码用来获取当前帧的时间,但是要注意这里面的Time并不是[UnityEngine.Time],而是父类中定义的的Time。一定不要用混了。

float deltaTime = Time.DeltaTime;

Entities.WithName仅仅是调试使用,调试信息或者Profiler中会显示这个名字,方便你找到对应的代码。

核心代码是Entities.ForEach中的代码,ForEach的参数是一个lambda匿名方法。其中ref的参数表示会写入,in的参数表示是只读的参数。注意这些参数的修饰一定要准确使用,这样Job才能正确的判断每种数据的用途。

ECS中有实体查询(entity query),可以根据传入的参数类型,找到所有同时拥有这些Component的实体。比如上面代码就会找到同时拥有Rotation和RotationSpeed_ForEach组件的所有实体。

lambda中的方法执行具体的内容。在这需要注意需要使用新的数学库[Unity.Mathematics]而不是原来的 [UnityEngine.Mathf] 。上面代码中是用原来的旋转,乘以需要旋转的四元数,得到旋转后的结果。

咱们场景中只有一个Cube,所以查询到的Entity就只有一个。如果有多个Entity都符合条件,那么这个System就可以同时处理这些Entity。

总结

好了,到这咱们的ECS Hello World就完成了,但是其中很多代码为什么这么写,以及背后的原理都没有讲清楚。后面咱们详细拆解一下每一部分代码,掌握ECS的核心。

- 喜欢本文,关注博主 -

如果你喜欢本文的话,在官网 unity.cn 或 Unity Connect App 搜索关键词“ECS” 就可以找到这篇文章,还可以收藏起来,慢慢学习哦。

想要你的创意被更多人看见吗?快快加入Unity社区, 在社区内分享经验,你也有机会获得Unity官方推荐哦!

博客发布入口:unity.cn/articles - “写文章"


Unity线上技术大会将于11月16日盛大开启,大咖精讲Unity在游戏、工业、传媒娱乐三大领域的最前沿技术,报名即可免费参与。届时,首届MWU中国榜单年度奖项将于开幕式颁发,作品征集10月30日截止

点击关键词

获取更多信息

Unity 产品服务:

游戏领域 - | | | | | |

XR领域 - |

电影与娱乐领域 -

工业领域(ATM、AEC) -

Unity 教育 - |创想家

Unity 人才联盟 -

Unity 技术精讲

[1]

[2]

[3]

[4]

[5]


Unity 官方微信

第一时间了解Unity引擎动向,学习最新开发技巧

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
欧冠半场阿森纳1-0领先,有望首夺欧冠,巴黎盼逆转卫冕

欧冠半场阿森纳1-0领先,有望首夺欧冠,巴黎盼逆转卫冕

阿嵀体育评论
2026-05-31 01:02:17
他58岁任四川省委书记,61岁接替华主席的职务,后来组建武警部队

他58岁任四川省委书记,61岁接替华主席的职务,后来组建武警部队

旧史新谭
2026-05-31 02:04:51
宁波知名法餐厅老板娘吴优琴去世,年仅39岁,嫁老外定居中国11年

宁波知名法餐厅老板娘吴优琴去世,年仅39岁,嫁老外定居中国11年

裕丰娱间说
2026-05-30 18:31:41
NVIDIA杀入笔记本CPU市场!戴尔XPS确认搭载N1X

NVIDIA杀入笔记本CPU市场!戴尔XPS确认搭载N1X

快科技
2026-05-29 18:09:06
阿根廷38岁国脚落叶归根!带着28冠加盟河床,世界杯后退出国家队

阿根廷38岁国脚落叶归根!带着28冠加盟河床,世界杯后退出国家队

球场没跑道
2026-05-30 15:41:09
广东佛山这个“任性”的区,明明隶属于佛山市,却不说是佛山人?

广东佛山这个“任性”的区,明明隶属于佛山市,却不说是佛山人?

刘小顺
2026-05-30 12:28:03
基辅传出爆炸声 普京称俄乌冲突临近收尾

基辅传出爆炸声 普京称俄乌冲突临近收尾

看看新闻Knews
2026-05-30 08:20:01
中国女人到底有多少看过黄片?答案可能让你大吃一惊!

中国女人到底有多少看过黄片?答案可能让你大吃一惊!

樱桃小丸子1987
2026-05-20 14:46:33
重磅!美国最新抗癌利器落户广州!不动刀3-5次精准灭癌瘤

重磅!美国最新抗癌利器落户广州!不动刀3-5次精准灭癌瘤

王二哥老搞笑
2026-05-30 20:36:58
学齐达内?中超出现“铁头功”:核心外援被罚下,青岛海牛麻烦了

学齐达内?中超出现“铁头功”:核心外援被罚下,青岛海牛麻烦了

足球大腕
2026-05-30 23:54:20
中国强硬抓捕150名菲人,菲方24小时内放人

中国强硬抓捕150名菲人,菲方24小时内放人

安逸安逸
2026-05-30 10:45:04
黑哨单丹奥再次1/2哨吹死泰山队,拜合拉木逃红,宿茂臻吃到黄牌

黑哨单丹奥再次1/2哨吹死泰山队,拜合拉木逃红,宿茂臻吃到黄牌

呀古铜
2026-05-31 00:18:52
重大发现!南宋皇宫遗址的碎骨堆中,重庆专家找到我国首枚考古出土的大齿鼠遗骸

重大发现!南宋皇宫遗址的碎骨堆中,重庆专家找到我国首枚考古出土的大齿鼠遗骸

上游新闻
2026-05-26 16:05:20
抓中国150人,中使馆直接下达通牒,马科斯姐姐:可怕时刻到了!

抓中国150人,中使馆直接下达通牒,马科斯姐姐:可怕时刻到了!

潮鹿逐梦
2026-05-31 00:20:20
车圈大佬发声:价格战远去,但竞争仍残酷!

车圈大佬发声:价格战远去,但竞争仍残酷!

中国基金报
2026-05-30 10:28:50
美国AI巨头叛变:Claude最新模型一开口:我是DeepSeek

美国AI巨头叛变:Claude最新模型一开口:我是DeepSeek

快科技
2026-05-29 19:34:12
武汉大学躺枪!网传广汽集团副总及营销项目负责人,均毕业于该校

武汉大学躺枪!网传广汽集团副总及营销项目负责人,均毕业于该校

火山詩话
2026-05-27 17:48:39
我主刀16年被降职,上头指名要我手术,我:已辞职,院长懵了

我主刀16年被降职,上头指名要我手术,我:已辞职,院长懵了

青青会讲故事
2025-06-30 16:11:45
年轻人想去纪委工作,要三思而行!

年轻人想去纪委工作,要三思而行!

一口娱乐
2026-05-30 19:36:20
一月八万不够花,李双江“赖”学校不退休,儿子改名出国后再作妖

一月八万不够花,李双江“赖”学校不退休,儿子改名出国后再作妖

一盅情怀
2026-05-16 20:12:47
2026-05-31 03:27:00
Unity incentive-icons
Unity
Unity中国官方帐户
2475文章数 6733关注度
往期回顾 全部

科技要闻

车圈大佬发声:价格战远去,但竞争仍残酷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

头条要闻

两名9岁女孩被困电梯近2小时 求救几十次物业无动于衷

体育要闻

岁月不饶人!39岁德约鏖战近5小时拼到呕吐

娱乐要闻

张碧晨《歌手》 “活人微死” 自嘲

财经要闻

双汇管不住一头猪

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

数码
本地
时尚
旅游
公开课

数码要闻

华擎RX 9070 XT太极十周年版曝光:黑白金配色首次亮相

本地新闻

用剪纸的方式,打开江苏扬州

美回巅峰的她们,带火的这些爆款真的好用吗

旅游要闻

伊利亮相2026“跟着品牌去旅行”对接交流活动 以工业文旅融合彰显中国品牌力量

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版