什麼是ECS (Entity-Component-System)

在開始寫 RealityKit 程式之前,必須先了解RealityKit 的核心架構:ECS (Entity-Component-System),也就是「個體-元件-系統」三者之間的關係,以及為什麼需要 ECS。

上節提過,SceneKit 與 RealityKit 都是用來建構3D虛擬場景,但兩者方法有明顯區別。

第1課 SceneKit 建構場景的概念很簡單,就是用「樹狀結構」將每個節點連結在一起,節點(SCNNode)可以是3D物件、燈光或鏡頭,所以場景的主要內容就是由一個個節點組成,如下圖左。

截圖 2024-09-29 晚上10.33.32.png

RealityKit 的觀念很類似,場景也是由樹狀結構組成,但每個節點稱為”Entity”(個體),而最上層的根節點則由 RealityView 的「內容」取代,如上圖右。

RealityKit 個體(Entity)的樹狀結構同樣有階層關係,父個體的座標變換會影響到子個體,也就是說,子個體會跟隨父節點一起位移、旋轉、縮放、鏡像,如同綁在一起;父個體如果隱藏(hidden),子個體也會跟著不見。

那麼,個體(Entity)和節點(SCNNode)除了名稱不一樣,還有何不同呢?答案是兩者內涵大不相同。

SceneKit 有個明顯缺點,就是節點(SCNNode)屬性非常多(參考6-1c節點屬性圖),因為要將各種功能(光照、材質貼圖、動畫、物理模擬、粒子系統…)相關屬性加進來,每種功能需要若干屬性,因此SCNNode所有屬性與方法將近100個!但實際運用時,個別節點通常只用到一小部分屬性,卻讓整個物件顯得相當臃腫。

而 RealityKit 要面對更多樣的應用,需要的屬性與方法只會更多,如何避免物件過於臃腫呢?RealityKit ECS 用了一個巧妙的方法 — 將不同用途的屬性與方法加以分組,每組稱為一個元件(Component),元件視需要可以動態載入,這樣一來,Entity (個體)可依照需要加掛不同元件,個別物件就輕盈許多。

也就是說,RealityKit 的個體(Entity)是由不同元件(Component)組成,每個元件有各自的屬性與方法,有需要時再加進來。