[Unity手札]初探ScriptableObject

ScriptableObject(可程序化物件)是Unity獨特的一種描述檔案資料的文件格式,而這個資料檔案通常稱之為.asset。Unity有很多功能性質的編輯檔案都會透過ScriptableObject來實現,像是Post-Processing Stack的Profile或是LWRP、HDRP的Setting檔,都是透過ScriptableObject來實作。

透過ScriptableObject製作成的檔案基本上有幾個好處

  1. 將常常需要動態變動的資料設計在ScriptableObject上,透過讀取外部資料的方式就可以不需要重新打包也可以更新資料。
  2. 本身是資源檔,可以直接被引用到其他腳本上。
  3. 沒有MonoBehavior的負擔。
  4. 可以轉換成Asset Bundle。
  5. 可以撰寫特定的程式判斷來確定資料的正確性
  6. 可覆寫Awake、OnEnable、OnDissable、OnDestroy
  7. 一個ScriptableObject檔案可以跨場景與跨Prefab共用同一份
  8. ScriptableObject檔案可以runtime時動態修改

雖然感覺好像XML、JSON等之類的當案也是可以做到動態更新之類的好處,但是還是必須撰寫一些載入或是分析資料的程式,所需的工作其實也是蠻多的,所以ScriptableObject就帶來了很大的便利性。

撰寫一個ScriptableObject程式腳本

  • 建立一個C#程式腳本
  • 將本來繼承於MonoBehavior的部分改為繼承ScriptableObject
  • 將預設宣告的Start、Update函式刪除
  • 加上自己想要調整的變數。通常會將資料設計為一個Serializable的class封裝起來,方便日後維護與引用。
直接將資料宣告在ScriptableObject裡
將資料設計為Serializable的class

建立一個ScriptableObject檔案物件

  • 在已經寫好的ScriptableObject類別上加上CreateAssetMenu
fileName:建立檔案時的預設名稱。menuName:選單工具的路徑。order:在選單清單中的順序
  • 如此就可以在Editor的Assets\Create看到你所宣告的ScriptableObject
在Project View視窗按下滑鼠右鍵就可以在Create裡找到建立檔案的功能選單
  • 點擊後就會在Project視窗裡建立一個以ScriptableObject所宣告的資料結構產生一份Profile檔案

在其他物件上使用建立好的Profile檔案

  • 在腳本上宣告要加載的ScriptableObject
將建立好的ScriptableObject檔案拖曳到欄位裡
  • 透過Resource載入
建立好的ScriptableObject檔案要放在Resources資料夾裡

遊戲開發中很重要的一個精神就是資料驅動,程式將系統功能設計好,將可參數化的部分抽離出來形成檔案,透過讀取資料的方式來使系統呈現不同的風貌,這就是資料驅動。ScriptableObject可以很容易地實現資料驅動,讓系統與參數能成為密不可分又能任意修改的框架,使遊戲開發更加的方便與彈性。

一位遊戲開發者,熱愛遊戲、籃球、健身與遊戲程式設計 / A game developer, love in play game, basketball, fitness and programming for game.

一位遊戲開發者,熱愛遊戲、籃球、健身與遊戲程式設計 / A game developer, love in play game, basketball, fitness and programming for game.