Dependency Injection in Unity3D Part 2: 如何開始?

延續上一篇的例子,
接下來都會以Zenject這個DI框架來做範例

目標功能:讓英雄可以四處移動與射擊,可以切換武器

1. 導入Zenject (應該大家都沒問題,就不贅述了)

2. 編寫主邏輯
可以看到Hero負責移動,Armony負責處理武器發射,
Game在每偵處理輸入,這裡讓我偷懶一下,記得去InputManager註冊一下SwitchRight與SwitchLeft

3. 創造武器
我們先編寫2種武器
Rifle向前射出子彈
TripleRifle額外從左右30度方向射出子彈
大家應該都了解Pool Pattern,所以基於篇幅就不貼出BulletPool

4. 最後,編寫Composition Root
我們先來談談Composition Root是什麼。
回想你在學習任何一個新語言的時候,總是需要一個main函式來當作程式的進入點,並在main函式創建所有軟體所需要的instance。我們在使用DI時,一樣需要一個進入點在這個進入點處理所有的相依關係。

在Zenject,進入點為scene的Awake()。Zenject把scene需要的相依邏輯集中在稱作SceneContext的腳本上。一個scene只能有一個SceneContext,一個context可以有多個installer。

寫完installer之後,就可以把它放到場景上了。

大功告成

從程式碼可以看到,場景上的物件除了SceneContext,只有Hero與Bullet而已,甚至連BulletPool都不是MonoBehaviour

接下來的篇幅

可能有人會覺得,這樣子的功能,用MonoBehaviour-base寫會比較快。
因此下一篇會比較DI與MonoBehaviour-base在開發上的不同。

2 則留言

  1. 不好意思大大
    我做到最後一步時卡住了
    不管怎麼做Scene context都沒有出現自己寫的Installer
    看了一下似乎要是asset檔案才行
    有建議嗎?

    • 嗨,我剛剛用新版的Zenject(9.2.0)試做了以上步驟,是可以運作的。
      我猜你可能誤解GameInstaller是自動生出來的,其實不是。

      那張圖片的步驟其實是:
      1. 你要自己在SceneContext底下自己再生成新的GameObject
      2. 然後把GameInstaller組件掛上去
      3. 然後把這個SceneContext底下的GameObject塞到SceneContext的Mono Installers列表內
      (因為寫出來的這個GameInstaller是繼承自MonoInstaller)

      你應該有注意到,SceneContext上除了MonoInstaller,
      還有ScriptableObjectInstaller與PrefabInstaller。
      而5.0版的順序與9.2版的順序不同,因為原開發者後來覺得用ScriptableObjectInstaller比較好所以擺成第一個。

      謝謝你提醒我也該更新一下以前寫的東西了XD

發佈留言