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

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.

相关推荐
热点推荐
泽连斯基没想到,在大规模袭击俄本土后,俄乌冲突正步入失控深渊

泽连斯基没想到,在大规模袭击俄本土后,俄乌冲突正步入失控深渊

霁寒飘雪
2026-06-30 16:48:29
刘尚进任重庆市副市长

刘尚进任重庆市副市长

新京报
2026-06-30 08:11:13
里弗斯续约不到一周!湖人恐面临拆队 詹姆斯领衔5主力或集体离开

里弗斯续约不到一周!湖人恐面临拆队 詹姆斯领衔5主力或集体离开

大卫的篮球故事
2026-06-29 19:57:27
“骗”了我们30年!韩红父亲居然是家喻户晓的他,难怪都不敢得罪她

“骗”了我们30年!韩红父亲居然是家喻户晓的他,难怪都不敢得罪她

LULU生活家
2026-06-14 08:38:31
1-1,夺冠霸主轰然倒下,高开低走各种作,球迷:自作孽,不可活

1-1,夺冠霸主轰然倒下,高开低走各种作,球迷:自作孽,不可活

我就是一个说球的
2026-06-30 16:34:26
阿娇成功瘦10斤变美,首次晒出一日三餐减肥餐,好吃又不用饿肚子

阿娇成功瘦10斤变美,首次晒出一日三餐减肥餐,好吃又不用饿肚子

椰黄娱乐
2026-06-30 10:10:26
灵活就业破3亿后,开始宣传灵活就业的好处了:性价比高赚钱多...

灵活就业破3亿后,开始宣传灵活就业的好处了:性价比高赚钱多...

灯锦年
2026-06-30 21:16:25
安切洛蒂胆子真大?巴西踢日本敢一分钟都不让内马尔上,真相来了

安切洛蒂胆子真大?巴西踢日本敢一分钟都不让内马尔上,真相来了

云隐南山
2026-06-30 13:31:26
新华社消息|外交部:中方绝不允许日菲侵害中方海洋权益

新华社消息|外交部:中方绝不允许日菲侵害中方海洋权益

新华社
2026-06-29 18:43:01
头号帮手已被中国镇住!日高层暴怒,送中国5个字:绝不能容许!

头号帮手已被中国镇住!日高层暴怒,送中国5个字:绝不能容许!

小影的娱乐
2026-06-30 20:22:03
哪一刻让你意识到和对方是两个世界的人?网友:眼界差距难以逾越

哪一刻让你意识到和对方是两个世界的人?网友:眼界差距难以逾越

夜深爱杂谈
2026-06-28 22:30:51
医生发现:能跑能跳的老人,基本在70岁,就已经不做这6件事了

医生发现:能跑能跳的老人,基本在70岁,就已经不做这6件事了

芹姐说生活
2026-06-30 19:12:40
斯卡洛尼紧急调整计划:阿根廷全队放假,应对美国极端高温

斯卡洛尼紧急调整计划:阿根廷全队放假,应对美国极端高温

宝哥精彩赛事
2026-06-30 01:31:31
美国为何禁止种植竹子?终于明白,原来竹子比我们想象的更可怕

美国为何禁止种植竹子?终于明白,原来竹子比我们想象的更可怕

科技故事聚焦
2026-06-26 09:13:52
以当前的实力,一旦中日打起来,结局会怎样?美俄看法一致

以当前的实力,一旦中日打起来,结局会怎样?美俄看法一致

迷彩前沿
2026-05-29 12:52:40
仁川登陆后下落不明的人民军延安派将领,第18步兵师团长金兴

仁川登陆后下落不明的人民军延安派将领,第18步兵师团长金兴

阿柒的讯
2026-06-30 13:10:30
知名音乐人在酒店跑步机上摔倒,不幸离世,滚石唱片发声明:第一时间竟是拍照而非救人,万豪酒店应公开道歉

知名音乐人在酒店跑步机上摔倒,不幸离世,滚石唱片发声明:第一时间竟是拍照而非救人,万豪酒店应公开道歉

封面新闻
2026-06-29 18:54:07
日媒哀嚎:中国压力超唐朝!日本千年最大危机

日媒哀嚎:中国压力超唐朝!日本千年最大危机

白浅娱乐聊
2026-06-30 00:37:31
爆冷!对方朝莎莎狠狠拍球,马上被裁判扣分,覃予萱3-1击败温特

爆冷!对方朝莎莎狠狠拍球,马上被裁判扣分,覃予萱3-1击败温特

小七说篮球
2026-06-30 14:45:00
还有机会赶超吗?深圳与新加坡经济差距越来越大,已突破4000亿!

还有机会赶超吗?深圳与新加坡经济差距越来越大,已突破4000亿!

冰语历史
2026-06-30 15:02:16
2026-06-30 21:51:00
Unity incentive-icons
Unity
Unity中国官方帐户
2482文章数 6733关注度
往期回顾 全部

科技要闻

iPhone18 Pro遭泄密!印度代工商惹祸

头条要闻

坎贝尔承认:中国是最成功渡过难关的国家

头条要闻

坎贝尔承认:中国是最成功渡过难关的国家

体育要闻

大热倒灶压力给到法国 王楚揭法国队隐患

娱乐要闻

韩红称要退出公益,多位名人挽留

财经要闻

万亿“寒王”,历史时刻

汽车要闻

奇瑞风云A9探店 五个理由一定来看看

态度原创

艺术
家居
手机
房产
军事航空

艺术要闻

心静则明,境远乃幽:山水画里的东方哲学密码

家居要闻

传奇筑 日常诗

手机要闻

BIGME大我HiBreak Dual 2价格公布,699美元起

房产要闻

等了三年!改善顶流实景交付,海口标杆的的答卷来了!

军事要闻

以色列防长:穆杰塔巴已被列入死亡名单

无障碍浏览 进入关怀版