官方案例解析5
開始之前的準備工作:
0下載Unity編輯器(2019.1.0f1 or 更新的版本),if(已經下載了)continue;
1下載官方案例,打開Git Shell輸入:
git clone https://github.com/Unity-Technologies/EntityComponentSystemSamples.git --recurse
or 點擊Unity官方ECS示例下載代碼
if(已經下載了)continue;
2用Unity Hub打開官方的項目:ECSSamples
3在Assets目錄下找到HelloCube/5. SpawnFromMonoBehaviour ,並打開SpawnFromMonoBehaviour 場景
5. SpawnFromMonoBehaviour
這個案例演示了我們如何使用預設遊戲對象來生成實體和組件,場景將由此生成一大堆旋轉的方塊對,下面一起來一探究竟吧:
- Main Camera ……主攝像機
- Directional Light……光源
- Spawner……旋轉方塊生成器
我們注意到RotatingCube不見了,取而代之的是一個Spawner生成器,原來旋轉的方塊兒被做成預設Prefab了,被Spawner上的Spawner_FromMonoBehaviour腳本引用,下面我們來看一下這個腳本是如何生成實體和組件的:
/// <summary>
/// 生成旋轉的方塊兒實體以及其組件
/// </summary>
public class Spawner_FromMonoBehaviour : MonoBehaviour
{
/// <summary>
/// 旋轉的方塊兒預設
/// </summary>
public GameObject Prefab;
public int CountX = 100;
public int CountY = 100;
void Start()
{
// Create entity prefab from the game object hierarchy once
//一次性從遊戲對象層級中創建實體預設
var prefab = GameObjectConversionUtility.ConvertGameObjectHierarchy(Prefab, World.Active);
//緩存實體管理器
var entityManager = World.Active.EntityManager;
for (var x = 0; x < CountX; x++)
{
for (var y = 0; y < CountY; y++)
{
// Efficiently instantiate a bunch of entities from the already converted entity prefab
//從已經轉化的實體中高效地實例化一大堆實體
var instance = entityManager.Instantiate(prefab);
// Place the instantiated entity in a grid with some noise
//把實例化的實體放進隨機噪點的格子中
var position = transform.TransformPoint(new float3(x * 1.3F, noise.cnoise(new float2(x, y) * 0.21F) * 2, y * 1.3F));
entityManager.SetComponentData(instance, new Translation {Value = position});
}
}
}
}
這裏需要補充說明的是SetComponentData方法,該方法將數值傳進組件中,並讓組件儲存起來。
生成的方塊就是案例2.IJobForEach中的方塊,它們會按照案例2的ECS系統運行起來,這個流程是DOTS驅動的,無需額外代碼。這也算是ECS的優勢吧,隨時隨地的複用,一開始我們覺得麻煩,到這裏複用代碼的時候,就會覺得輕鬆了。
小結
以前寫的系統,就是我們制定的規則,規則存在就會運行起來,無需額外編寫代碼!
這就是所謂更加乾淨,且高效的代碼!
DOTS 邏輯圖表
Spawn流程大體如下:
DOTS系統:
這一篇因爲複用了之前第二篇,所以很簡單,ECS越到後期就越簡單吧,因爲複用的組件和系統都會越來越多的。
更新計劃
作者的話
如果喜歡我的文章可以點贊支持一下,謝謝鼓勵!如果有什麼疑問可以給我留言,有錯漏的地方請批評指證!
如果有技術難題需要討論,可以加入開發者聯盟:566189328(付費羣)爲您提供有限的技術支持,以及,心靈雞湯!
當然,不需要技術支持也歡迎加入進來,隨時可以請我喝咖啡、茶和果汁!( ̄┰ ̄*)