1. 程式人生 > >關於Unity 2018的實體元件系統(ECS)二

關於Unity 2018的實體元件系統(ECS)二

孫廣東  2018.5.20

關於Unity 2018的實體元件系統(通用名稱ECS)二 將介紹如何在Unity上使用實體元件系統(通常稱為ECS)。 這次的內容是Unity提供的ECS API的基本用法,一個小應用程式和並行化。 它不包括與Unity的GameObject / Component的合作,以及實際使用。獲取可以使用ECS的編輯器Unity2018 和之後的版本都可以! 之後,下載與您自己的作業系統匹配的編輯器並安裝它。
建立一個可以使用ECS的專案我將建立一個專案,但我無法使用ECS。要啟用ECS,需要兩件事。
  • 使使用 .NET 4.x
  • 重寫 manifest.json
正常啟動Unity並開啟 Edit> PlayerSettings> PlayerSettings。之後,將Scripting Runtime Version指令碼執行時版本更改為Stable (.net 4.x)
接下來是重寫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的程式碼有問題。一點評論看以下內容。對於每個角色的 ECS 是如下所示。
那麼,首先ComponentData,這裡重要的是struct(結構)並繼承IComponentData。將它用作ComponentData時,這兩個都是必需的。
建立實體ECSMain是一種建立實體的翻譯,但它從MonoBehaviour事件中呼叫它,等等。正如你在註釋中看到的那樣,
  • 獲取EntityManager
  • 建立實體原型
  • 根據原型資訊建立實體
這是一個流程。似乎沒有必要考慮ComponentData儲存在原型中的順序以及建立它的時機。只有內在的東西才是重要的。最後一個關於CountSystem作為ComponentSystem。這是一個兩部分組成。
  • 組的定義
  • 處理內容
首先是Group的定義和實際injection的程式碼。ComponentDataArray包含(指向)請求元件的指標,而Length包含具有請求ComponentData的實體數目。在 [Inject] 中,自動注入對請求組的引用。下半部分程式碼... OnUpdate() 部分只需新增數字。請注意,組的內容是一個結構,因此您不能直接分配它。增加系統的例子接下來我會嘗試增加系統。 如果計數器超出範圍,則該過程的內容就像刪除一樣。功能解釋忽略了更多的效率。
ECS基本上由類似皮帶輸送機的流程任務組成,系統處理一些ComponentData並將其傳遞給下一個系統....因此,“新增計數器並在計數器超出範圍時移除計數器”
  • 稱為“實體包括計數器”的容器
  • 向系統新增計數器
  • 系統 檢查計數器並丟棄它,如果它是無用的

為了實現這一點,我會再增加一些。
  • Common ComponentData 獲取範圍
  • 計數超出範圍時刪除實體的 系統
  • CountSystem之間的依賴關係

程式碼在這裡:ComponentDatas.cs
using Unity.Entities;// 実體public struct CountData : IComponentData{ public int count;}[System.Serializable]public struct RangeData : ISharedComponentData{ public int min, max;}
ECSMain.cs
using UnityEngine;using Unity.Entities;using Unity.Collections;public class ECSMain : MonoBehaviour{ [SerializeField] RangeData range; EntityArchetype sampleArchetype; void Start() { var entityManager = World.Active.GetOrCreateManager<EntityManager>(); sampleArchetype = entityManager.CreateArchetype(typeof(CountData), typeof(RangeData)); } private void Update() { if(Input.anyKey) { var entityManager = World.Active.GetOrCreateManager<EntityManager>(); var entity = entityManager.CreateEntity(sampleArchetype); entityManager.SetSharedComponentData<RangeData>(entity, range); } }}
RangeSystem.cs
using Unity.Entities;using Unity.Collections;using Unity.Jobs;[UpdateAfter(typeof(CountSystem))]public class RangeSystem : ComponentSystem{ struct Group { public int Length; public EntityArray entities; [ReadOnly] public ComponentDataArray<CountData> countData; [ReadOnly] public SharedComponentDataArray<RangeData> rangeData; } [Inject] Group group; protected override void OnUpdate() { for (int i=0; i<group.Length; i++) { var range = group.rangeData[i]; var data = group.countData[i]; if ( data.count > range.max || data.count < range.min ) { PostUpdateCommands.DestroyEntity(group.entities[i]); } } }}
解釋一下程式碼:首先,我們添加了RangeData,它是用於範圍判斷的ComponentData。但是,由於該“範圍資訊”在大多數資料中具有相同的值,因此使用對多個實體公用的IShardComponentData。還添加了Serializable屬性,以便可以使用Inspector進行設定。
ECSMain添加了這個CountData。(1) 首先,RangeData顯示在Inspector上,以便編輯,(2) RangeData作為型別新增到原型中,(3) RangeData設定在建立的Entity中。之後,我們通過按下按鈕來改變實體的型別。
最後是系統。 雖然它是一個系統,當它超出範圍時刪除實體......當然,它有必要獲得“範圍”。因此,在(2) 中,RangeData包含在組中。在③中,使用DestroyEntity刪除實體。 這裡值得注意的是Update ① 和 [ReadOnly] 。這兩個用法大致相同,似乎如果[ReadOnly]存在,它將在使用[WriteOnly]等的系統之後被呼叫。同樣,如果有UpdateAfter,它將在指定的系統之後被呼叫。

並行化 在這段時間結束時,嘗試並行化ECS處理。目標是增加計數。當處理負載相當長或者有很多物件時,並行化可能是一個好結果。CountSystem.cs
using Unity.Entities;using Unity.Jobs;public class CountSystem : JobComponentSystem{ AddCounterJob job; protected override void OnCreateManager(int capacity) { base.OnCreateManager(capacity); // 做一份工作 job = new AddCounterJob(); } // 釋出工作 protected override JobHandle OnUpdate(JobHandle inputDeps) { return job.Schedule(this, 64, inputDeps); } [ComputeJobOptimization] // Burst編譯器的優化屬性 struct AddCounterJob : IJobProcessComponentData<CountData> //請求ComponentData { public void Execute(ref CountData data) { data.count++; } }}
下圖是處理大約6000個實體的時間比較。由於它將並行和burst結合在一起,所以存在很大的差異。

但是,有很多地方不能使用並行,因為這種資料處理和行為在可用資料和行為方面受到限制。在某些情況下,如果您使用C# Job System,您可能可以做更多...

相關推薦

關於Unity 2018實體元件系統ECS

孫廣東  2018.5.20關於Unity 2018的實體元件系統(通用名稱ECS)二 將介紹如何在Unity上使用實體元件系統(通常稱為ECS)。 這次的內容是Unity提供的ECS API的基本用法,一個小應用程式和並行化。

Unity 2018 Shading讀書筆記

1. Post Processing Stack 必須是在Unity 2018才能使用的一個內建功能。如果沒有安裝,需要首先在Unity編輯器的Package Manager內安裝,如下圖: 通過介面選單的Windows -> Package Manag

【Unity3D基礎教程】給初學者看的Unity教程:理解Unity的新GUI系統UGUI

理解UGUI的基礎架構 UGUI是Unity在4.6中引入的新的GUI系統,與傳統的中介軟體NGUI相比,這套新GUI系統有幾個核心亮點: 放棄了Atlas的概念,使用Packing Tag的方式來進行圖集的規劃 放棄了depth來確定UI顯示層級的概念,使用Hierarchy的SiblingIndex

Unity2018新功能之Entity Component SystemECS

,我們簡單的介紹了ECS的概念和Entities的使用方法,我將在這篇文章中繼續深入講解ECS的框架。 首先我們先來看下面這一張圖。這是我通過ECS框架創建出來的5萬個Cube,FPS基本穩定在30左右,因為預設是實時光照,所以渲染壓力有點大,這不是我們這篇文章的討論範圍。

理解 元件-實體-系統 ECS \CES遊戲程式設計模型

一般來說,我們實現遊戲實體都是採用面向物件的方法進行程式設計。每一個實體都是一個物件,並且需要一個基於類的例項化系統,允許實體通過多型來擴充套件。但是,這樣的方法,往往導致系統中出現大量的類,造成類爆炸的情況出現。隨著新的實體出現,我們發現很難在類繼承圖中新增新的實體,

2018年ElasticSearch6.2.2教程ELK搭建日誌采集分析系統目錄

1.2 安裝包 接口 語句 參數配置 介紹 ofo 計劃 裝包 章節一 2018年 ELK課程計劃和效果演示 1、課程安排和效果演示 簡介:課程介紹和主要知識點說明,ES搜索接口演示,部署的ELK項目演示 章節二 elasticSearch 6.2版本基礎講

unity背包系統摘抄

圖形 彈出 作用 網格 listen 系統 原創文章 vat 文章 新的背包系統包括: 1、一個用於表示背包系統的按鈕: 該按鈕上添加了EventListener事件,該事件經過改寫,可用於實現點擊一次展示,點擊第二次消失的效果。 代碼比較簡單,主要是在EventLis

Java簡單部落格系統基於實體聯絡模型設計資料庫

  基本概念 簡單屬性:不能劃分為更小的部分(其他屬性)。 單值屬性:一個特定實體有隻有單獨的一個值。 派生屬性:可以從別的相關屬性或實體派生出來。 最簡單的部落格系統 (一)實體集:使用者,部落格,評論,實體及其屬性列出如下: (二)聯絡集: 以上設計的實體集,聯絡集表示如

Unity 2018.2 新功能XR相關

概述 Unity 2018版本週期將圍繞Scriptable Render Pipeline (SRP)、Shader Graph、C# Job System、Entity Component System、Burst Compiler等核心功能展開,2018.2即在此基礎上新增新的功

機房系統——【日期控制元件DTPicker、比較日期大小】

    "寧可讓程式(員)多幹活,也不能讓使用者多做"。本著為使用者著想、給使用者以方便的原則,系統中用選代替填,給使用者減少很多不必要的麻煩。     在機房系統裡遇到了填寫日期的問題。VB中已經為我們提供了專門的日期控制元件,設

Unity UGUI有趣應用 】 -------------------- 揹包系統之簡易單頁揹包系統及檢索功能的實現

揹包系統,無論是遊戲還是應用,都是常常見到的功能,其作用及重要性不用我多說,玩過遊戲的朋友都應該明白。 在Unity中實現一個簡易的揹包系統其實並不是太過複雜的事。本文要實現的是一個帶檢索功能的揹包系統。先看一下我們要完成的效果 。由於上傳的gif圖不能大於5M,所以錄製

GamePlayKit的ECS實體-元件-系統

如有侵犯,請來信[email protected] 蘋果去年釋出了GameplayKit的程式碼框架,為遊戲開發者提供了很多超級實用的API及工具,來提升遊戲開發者的效率,使得製作遊戲能更加聚焦在遊戲本身-也就是遊戲性的策劃和創意上了。 業餘時間會用

網上購物系統Task007——自定義DateList控制元件分頁顯示商品資訊

原始碼:13033480群共享 一、資料集Model新增商品資訊類ItemInfo.cs。 using System; namespace WestGarden.Model { public class ItemInfo { privat

LibGDX_6.2: 常用系統控制元件: 標籤Label

1. 標籤(Label) 標籤控制元件主要用於輸出文字資訊,在舞臺中展示一下文字內容,例如玩家分數,主角血值,關卡說明等。 由於標籤是用來展示文字的,所以使用標籤首先要有點陣圖字型(BitmapFont)來 提供字元顯示 ,這裡使用前面章節建立好

Unity 回合制戰鬥系統初級篇

專案資源傳了,請看1樓 本人遊戲策劃一枚,愛好遊戲設計開發 最近學習了Unity之後,結合各種網上的教材和資料後自己實現了一套簡單的回合制戰鬥系統,如下 系統實現效果簡介: 1. 目前為1V1的固定回合戰鬥 2. 玩家操作通過介面按鈕輸入,怪物操作為自動 3. 包

機房收費系統1-註冊控制元件

根據師哥給的機房收費系統使用說明:在cmd命令中輸入“regsvr +路徑+控制元件名稱,相信大家在操作的時候都有如下試水。 看看犯的錯誤都覺得可笑,把”+“都給人家輸上了。圖中的錯誤提示框是最後一

Unity程式設計】Unity動畫系統

Unity動畫系統 Unity動畫系統,也稱為“Mecanim”,提供了以下功能: 簡單的工作流程,設定動畫的所有元素,包括物件,角色和屬性。 支援匯入外部建立的動畫片段和使用內建動畫編輯器製作的動畫片段。 人型動畫重新定位,動畫角色的運動控制可以被所有的

從零開始實現放置遊戲——實現後臺管理系統7地圖選擇控制元件

  前面做了地圖怪物的新增,刪除,查詢等功能。但新增怪物的時候,需要選擇怪物所在地圖。前幾張的原始碼中,我忘了把這部分改回去,所以如果想要成功新增,需要自己改一下html介面,手動填寫怪物所在地圖的ID。然而,我們配置的時候,地圖ID並不是固定的,而是資料庫自增的。所以這裡最好做成一個彈窗,點選後彈出一個地圖

文件系統III

作用 進行 管理 文件名 nod 字段 空間管理 技術分享 系統 文件系統的實現: 要註意磁盤上與內存中內容布局 名詞: 磁盤分區:把一個物理磁盤存儲空間劃分成幾個相互獨立的部分稱為分區 文件卷:磁盤上的邏輯分區,由一個或多個物理塊(簇)組成,文件卷可以為整個磁盤或部分

Unity Editor 檢查工程Prefab預設中的空組件

com game filepath ddr bug str 技術 程序 string 在我們做項目的過程中 經常會有預設中出現空的腳本 例如: 導致的原因是因為 腳本的丟失 現在我們來做一個檢查工程中有空腳本的預設工具 老規矩直接上代碼 放到工程就能用 using