Dependency Injection in Unity3D Part 4: 數值設定的注入與調整

回到Part2的例子,我們可能會想要調整下列的數值:

  1. 玩家的移動速度
  2. 子彈的移動速度
  3. 子彈的射速
  4. 三發彈的張開角度

以往在編寫可調整的數值設定時,我們通常習慣照著Unity官方教學的方法:


繼承MonoBehaviour,將要調整的參數設定成public或是SerializedField,參數就會在檢視區域出現。

但是,當遊戲規模變大時,就會發現參數調整變得麻煩了。
因為每次調整一個物件,就必須進行以下的步驟:

  1. 在場景內尋找正確的GameObject
  2. 調整數值
  3. 想辦法把調整後的數值記起來(可以利用Copy Component)
  4. 離開Play Mode (離開Play Mode後,數值會回到播放前的狀態)
  5. 再把數值寫回去

這樣做很花時間,又很費工,其實有更好的方法。

將數值設定寫成ScriptableObject

相信這個類別大家都耳熟能詳。ScriptableObject的用途是資料載體,官方當初設計的原則是覺得「資料」不應該直接附著在MonoBehaviour上,也不應該擁有MonoBehaviour所有的反射函式。

注入設定檔

我們將各個類別裡,需要調校的數值,「分別」做成一個Setting類別。
以Hero的例子來說,Setting類別內只有一個speed參數。
重要:如果你不熟C#,一定要記得附帶Serializable屬性才可序列化(第6行)

再來,遊戲啟動時,我們需要注入這份設定。MonoBehaviour不允許建構式,因此要寫一個注入函式(附帶Inject屬性的函式,第16行)

因此修改後的Hero類別如下:(可與Part2版本做比較)

編寫Installer與創造ScriptableObject

一般來說要自己寫個ScriptableObject的腳本,自己創造asset再自行注入。
不過Zenject已經幫我們把這件事簡化了,因此就像平時寫Installer一樣,只是繼承的是ScriptableObjectInstaller。

ScriptableObjectInstaller本身繼承了ScriptableObject,因此可以用CreateAssetMenu來創建ScriptableObject。

程式碼如下:

寫完後只要透過選單創建ScriptableObject,再如同一般的Installer一樣放進Context內即可。

舉一反三

相同的方法套用到其他類別去,我們的設定檔就會變成這樣子

如此一來,我們就可以更方便的在遊戲中調校各種參數。包括了一般數值、顏色、圖片、音效……等等,就如同平常在MonoBehaviour上做的事,原封不動的交給ScriptableObject,也避免了繼承MonoBehaviour的窘境。

 

發佈留言