ECS入門之Hello World

2021-01-18 Unity官方平臺

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


由於ECS概念過於複雜,還是看看如何Code吧, 咱們先來看下如何編寫一個最簡單的ECS代碼。



這就又要從Hello World說起了。


首先需要把DOTS的環境搭好。本課程最開頭講了如何安裝Entities包,如果還沒安裝好需要去複習一下。




這個Hello World需要做什麼呢?咱們用ECS來控制一個Cube的旋轉。


ECS咱們已經知道了分三個部分,咱們來看看這三個部分如何創建。


01  E:在場景中創建一個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

02  C:創建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上面吧。

03  S:用System控制Cube旋轉
using Unity.Entities;using Unity.Mathematics;using Unity.Transforms;
public class RotationSpeedSystem_ForEach : SystemBase{ protected override void OnUpdate() { float deltaTime = Time.DeltaTime;
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引擎動向,學習最新開發技巧





相關焦點

  • 只有170位元組,最小的64位Hello World程序這樣寫成
    我們先來編譯上面的程序:  $ gcc hello.c -o hello$ ./hellohello, world$ ll hello-rwxr-xr-x 1 root root 16712 Nov 24 10:45 helloTip: 後續所有的討論都是基於 64 位 CentOS7 作業系統。
  • Hello world!Hello Plankton!
    Hello world!Hello Plankton!所謂浮遊生物(Plankton),泛指生活於水中缺乏有效移動能力的一類生物。它們體型微小,種類繁多,廣泛地存在於海洋、湖泊以及河川中。
  • gRPC Python 入門到生產環境
    worldcd grpc_helloworld# 生成 helloworld_pb2.py 和 helloworld_pb2_grpc.pypython3 -m grpc_tools.protoc --proto_path=.
  • Mixly入門教程1:創意電子中的「Hello World」,點亮Arduino的LED
    圖1 國內外主流的創客教育編程軟體一、目標今天講解Mixly的入門篇:創意電子中的"Hello World",點亮Arduino自帶的LED燈。
  • 入門編程?先裝幾個稱手的工具!
    如果安裝成功會顯示gcc版本號,如下圖:打開記事本,輸入以下代碼#include <stdio.h>int main(int argc,char *argv[]){printf("hello
  • 高一化學入門經典課程之物質的量詳解
    高一新生化學入門課程之物質的量相關的概念和計算詳解hello,這裡是尖子生數理化教育,很高興又和大家見面了。各個地區的酷熱暑假結束了,迎來了涼爽的秋季,各位新生的軍訓生活也逐漸告於了段落,馬上要開始自己漫長的高中求學生涯了。不知道你準備到哪裡了?
  • 高一數學函數入門課程之函數的單調性詳解
    函數的單調性,這樣理解,才算真正入門了hello,大家好,這裡是尖子生數理化教育,很高興在這裡跟大家見面了。最近很多學生反應函數不知道怎麼學,不知道怎麼才能入門,一會函數定義域一會函數值域,一會周期函數,一會奇偶函數,一會函數單調性,整得有點崩潰了。
  • Python3之十大經典錯誤及其解決辦法
    一、 SyntaxError 語法錯誤(1)引號沒有成對出現報錯信息:1SyntaxError:EOL while scanning string literal錯誤示例:1string = 'hello world解決方法:字符串切記要放在引號中,單引號雙引號無所謂。
  • 《夢幻之星》主題曲《Save This World》
    who said we are lost again in this lonely worldI say we can start again; we're on the same ship.It's called starship Earth.
  • 就能帶你入門Python學習!超級詳細的基礎教程!
    成都達內就能帶你入門Python學習!超級詳細的基礎教程!來看下面的用法:字符串Python中的字符串使用單引號(『)或是雙引號(「)來進行標示,並且你還能夠在通過某一種標示的字符串中使用另外一種標示符(例如 「He said 『hello』.」)。而多行字符串可以通過三個連續的單引號(」』)或是雙引號(「」」)來進行標示。
  • EF hello人工智慧英語學習APP在中國開放免費下載
    打開APP EF hello人工智慧英語學習APP在中國開放免費下載 發表於 2020-02-12 07:02:00 在這一特殊時期
  • 遊戲盒子:在萌之方向一路向前的Hello bt21
    bt21的概念是由於韓國偶像組合防彈少年團的創意,因為組合的人氣,在沒有成軍出來之前已經擁有了一大班願意為之付費的粉絲,它們火爆的未來可想而知。在line friend盡心經營策劃的情況下,bt21已經開發了多個遊戲。今次要介紹的就是日本經營的hello bt21。這個款遊戲是一個類似於消消樂+連線的遊戲。
  • 嵌入式linux新手入門手記-準備qt5.4.1開發平臺
    這個手記寫到這裡,am335x的軟體平臺已經能夠正常工作了, tslib也已經能夠進行正確的觸控螢幕校正,自己編寫一個hello world的程序,並交叉編譯後,能夠在am335x上運行,並在超級終端上列印出「hello world」。
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    C語言的入門學習比較簡單。彙編語言——>B語言——>C語言2、C語言的特性首先C語言就是你的女朋友。無論你讓它幹什麼,它絕對不會自己找到方法。二、第一個C程序#include<stdio.h>int main(){printf("hello world");return 0;