最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity ECS 1.0.14 真?正式版的探索(一)

2023-08-23 05:47 作者:ms2308  | 我要投稿

本篇將嘗試基于最新版?Unity ECS 1.0.14 解決以下的游戲開發(fā)需求:

ECS 實體生成器

ECS 系統(tǒng)中的隨機數(shù)

ECS 實體的材質(zhì)

0. 前言

前篇介紹了 Unity ECS 1.0.14 正式版(2023/08)的 Demo 最簡實現(xiàn)?,涵蓋了 ECS 的核心基礎(chǔ)概念:

后續(xù)將嘗試逐一攻破游戲開發(fā)中會遇到的一系列需求。

1.?ECS 實體生成器

第一個目標是實現(xiàn)一個 ECS 實體生成器,對應(yīng)情景例如一個工廠(MonoBehavior)持續(xù)生產(chǎn)機器人(Entity),或機器人(Entity)持續(xù)發(fā)射大量子彈(Entity)。


1.1.?在運行時(Runtime)創(chuàng)建 ECS 實體

在上一篇的基礎(chǔ)范例中,ECS 實體是由子場景Subscene)中已存在的 GameObject 通過 AuthoringBaker 轉(zhuǎn)化而成,而現(xiàn)在我們希望實現(xiàn)在游戲中實時生成 ECS 實體。

參考官網(wǎng)文檔,基于 MonoBehavior 和?ECS Entity 的 Spawner 可參考該流程:

  1. 首先寫?Spawner 的 ECS 組件(IComponentData),用于儲存?Prefab 的 ECS 實體,并且可根據(jù)游戲設(shè)計自由調(diào)整加入固定的生成坐標、生成時間等等

  2. 子場景放置空 GameObject?轉(zhuǎn)為 ECS Entity 生成器,賦予攜帶 GameObject?Prefab 的 Spawner?Authoring 腳本和 Baker

  3. 實現(xiàn)該?Spawner 的?ISystem,使用實體管理器Entity Manager)或實體命令緩沖器(ECB)新實體

接下來將按照此流程實現(xiàn)一個范例:在場景中放置一個大方塊(GameObject),每次被鼠標點擊后生成一個新方塊(Entity。


1.2.?實現(xiàn)?CubeSpawner 的組件、Authoring、Baker

我們讓 CubeSpawner 的組件包括一個方塊的 Prefab、一幀生成的方塊數(shù)和位置:

接著在子場景創(chuàng)建一個 CubeSpawner 的空 GameObject,將 Authoring 腳本掛上去,并賦予?Prefab。

注意?Prefab 也需掛載 Authoring 和 Baker?,否則要額外向新生成的空實體逐一添加新組件或 Aspect。?


1.3.?實現(xiàn)?CubeSpawner 的 Aspect 和 System

雖然目前只有?CubeSpawner 組件,我們還是可以創(chuàng)建?Aspect 并將 Spawn 函數(shù)寫入(而非 Job 中),個人感覺這樣邏輯更清晰一些:

代碼中有一點需要特別注意,雖然實體管理者(Entity Manager)可用于生成新實體,但如果想利用 Job?以及并行處理則強烈建議不使用此方案,因為創(chuàng)建實體、添加組件等部分行為會造成結(jié)構(gòu)改變,導(dǎo)致內(nèi)存塊重構(gòu)。如強行使用必須手動設(shè)置同步點(Sync Point),既麻煩也不利于優(yōu)化。

所以 Unity 引入了線程安全的實體命令緩沖器?Entity?Command Buffer (ECB) 來對應(yīng)這種情況。簡單來說 ECB 把所有改變結(jié)構(gòu)的命令緩存后統(tǒng)一在主線程執(zhí)行?,并且也允許對新創(chuàng)建實體進行添加組件。

更多關(guān)于 ECB 的信息,可參考:https://docs.unity3d.com/Packages/com.unity.entities@1.0/manual/systems-entity-command-buffers.html

1.4 實現(xiàn)“在點擊處生成方塊”

為方便測試,我們可以用傳統(tǒng)方法基于?Raycast 做一個點擊觸發(fā)器,在點擊的坐標生成 Prefab 的?ECS 實體。

可設(shè)置一次點擊生成100個方塊以測試性能

掛在大方塊的 MonoBehaviour?點擊檢測腳本供參考:


2.?ECS?中的隨機數(shù)生成器

本階段的目標是給?ECS 系統(tǒng)增加一個可用的隨機數(shù)生成器,并實現(xiàn)將X軸上勻速移動方塊改為每3秒隨機改變方向的勻速移動方塊。

一般來說,在主線程生成隨機數(shù)只需隨便用一個種子初始化,然后持續(xù)從序列中獲取即可;但多線程并發(fā)時顯然要麻煩的多。在這里我們需解決兩個問題:一是在哪初始化隨機數(shù)生成器,二是如何設(shè)置種子避免所有生成器產(chǎn)生一樣的序列。

文檔和官方論壇并沒有找到明確的最佳實踐,調(diào)查比較后個人認為添加一個泛用的隨機生成器組件比較符合 ECS 的設(shè)計哲學(xué),并且可以利用初始 Spawner 中的隨機數(shù)生成器去給生成的實體賦予新的隨機種子。


2.1. 隨機生成器組件

我們創(chuàng)建一個泛用的隨機生成器組件:

代碼中有三點需要注意。

  1. 當(dāng) seed 設(shè)為0時, 我們用 UnityEngine.Random 為它初始化一個隨機的種子,然后賦予 Rnd 組件一個 Unity.Mathmatics.Random。這兩個類來自不同的命名空間,UnityEngine的是全局單例,所以我們不需要手動初始化,在主線程用非常方便,但無法在以外的情況用,所以組件中我們需要用?Unity.Mathmatics.Random?創(chuàng)建隨機數(shù)生成器。

  2. Spawner 和 Prefab?都需要添加該 Rnd 組件,Spawner 利用它為生成的方塊 Entity 里的隨機數(shù)生成器賦予隨機種子,方塊的 Prefab 則用它來實現(xiàn)隨機移動。

  3. 為了方便為方塊寄存一個隨機方向,我在組件中添加了一個 random_vector。但 Spawner 實際用不上這個變量,嚴格來說應(yīng)該再創(chuàng)建一個組件專門用來儲存它,但為了簡潔于是和隨機數(shù)生成器放在了一起。

2.2. 隨機方塊的移動方向

接下來我們需要分別實現(xiàn):

  1. 修改 Spawner 與 Prefab Moving?的 Aspect 使其包括 Rnd 組件

  2. 修改 Spawner 的 System?使其生成方塊時賦予新隨機生成器

  3. 修改 Prefab 的運動 System 使其定時隨機運動方向。

修改?Spawner 的 Aspect,不要忘記順便初始化隨機方向(可利用 NextFloat3Direction 隨機長度為1的三維向量),否則一開始所有方塊都會向同一方向移動。


修改 Prefab 的 Moving Aspect,每3秒變換一次移動方向。注意 Move 中額外引入了度過時間(Elapsed Time),用于判斷是否過了3秒。


2.3. 修改后執(zhí)行游戲后的效果如下

點擊大方塊后,生成的小方塊會隨機向四周移動

3. 更改?Prefab 材質(zhì)

本階段的目標是為每個 Prefab 生成的 Entity 賦予不同的材質(zhì)參數(shù),例如可以用于發(fā)射大量彩色子彈,或生成外形不同的機器人。

注意:目前還未發(fā)現(xiàn)網(wǎng)上關(guān)于這方面的教程,我的主要信息來源是官網(wǎng)?Entities Graphics 關(guān)于 C# 材質(zhì)覆寫的文檔:https://docs.unity3d.com/Packages/com.unity.entities.graphics@1.0/manual/material-overrides-code.html

更改?Entity Material 或?Mesh 的方案有兩個方案。最簡單的方式是用一個?Prefab 列表,在創(chuàng)建時進行選擇,利用前文的方法可簡單實現(xiàn)。在這里我們更關(guān)心的是如何在運行時通過 ECS System?對實體進行修改。

原本實現(xiàn)這塊是件比較麻煩的事,所幸無意間發(fā)現(xiàn) Unity 已經(jīng)為我們準備好了內(nèi)置的 Authoring 腳本和 System。在 Project 的 Packges/Entities Graphics/HDRPMaterialProperties (或 URP),我們可以找到一系列針對不同渲染屬性的腳本,僅僅只要掛在 Prefab 上就可生效。

接下來將展示將一個機器方塊的兩個燈點亮變化顏色,步驟如下:

  1. 為 Prefab 創(chuàng)建一個 Bot Component,分別將前燈、后燈、鏡頭燈的 Entity 保存,用于更改材質(zhì)參數(shù)

  2. 為 3 個燈的 Game Object 添加?HDRPMaterialPropertyEmissiveColor.cs (如需更改其他屬性亦或基于?URP 可自行替換),在 Unity 編輯器通過 Add Component 也可搜索到該腳本。

3.1. 用于儲存 Prefab 中的 Child GameObject

在 System 中,獲取 Entity 后修改對應(yīng)的 <HDRPMaterialPropertyEmissiveColor> 組件即可(具體實現(xiàn)將不再在后篇展示)。

3.2.?用于儲存 Prefab?中的?Child GameObject

float3 的 X,Y,Z 分別對應(yīng) Emissive Map 的 R、G、B

結(jié)果如下:

材質(zhì)參數(shù)成功對實體個例進行了覆寫

在下一篇將探索關(guān)于 ECS 實體的?批量行動?和?生命周期。

Unity ECS 1.0.14 真?正式版的探索(一)的評論 (共 條)

分享到微博請遵守國家法律
都兰县| 安丘市| 晋中市| 莆田市| 中西区| 留坝县| 托里县| 漠河县| 包头市| 通江县| 富源县| 东源县| 陇西县| 江源县| 新绛县| 麦盖提县| 太和县| 开封市| 渝中区| 青州市| 时尚| 巴南区| 梁山县| 原平市| 平远县| 山东| 乌苏市| 高雄市| 班戈县| 汕头市| 饶河县| 边坝县| 裕民县| 福泉市| 辽中县| 天门市| 广安市| 张家口市| 舟曲县| 长宁区| 青海省|