我不確定是在這里問還是在 GameDev Stack Exchange 上問更好。我相信它會延續到一般編程。
語境
- 我正在使用 Unity3D 并構建在線多人游戲。
- 我想使用建構式依賴注入,所以沒有“魔法”反射來保持簡單并能夠更清楚地查看我的依賴關系。
- 我想要解決依賴關系的子注入器類。
例如,當我將玩家生成到游戲世界中時,根 PlayerScript 將是一個注入器,它將決議所有玩家依賴項。
Player 將擁有一個 servicecollection,然后它將構建 Player 需要運行的每個服務。
問題
Player Injector 成為構建玩家需要的服務的大串列。我正在嘗試使用 SOLID 原則,因此通過將我的播放器服務拆分為許多較小的服務。這可能意味著播放器上有 20-30 個服務。用 20 到 30 行代碼來構建每個服務并傳遞它們的依賴項,這感覺是錯誤的。
如果它不在 Unity3D 中,這就是它的樣子。
Unity 示例之外
//PlayerMovement
Services.Add<CharacterController>(new CharacterController(Inj 1,Inj 2, Inj 3));
//PlayerInputs
Services.Add<UIInputs>(new UIInputs(Inject 1,Inj 2, Inj 3));
Services.Add<InventoryInputs>(new InventoryInputs(Inject 1,Inj 2));
Services.Add<MovementInputs>(new MovementInputs(Inj 1,Inj 2, Inj 3));
Services.Add<InteractionInputs>(new CrossHair(Inj 1,Inj 2));
//PlayerInventory
Services.Add<InventoryStateManager>(new InventoryStateManager(Inj 1,Inj 2, Inj 3));
Services.Add<PlayerInventory>(new PlayerInventory(Inj 1,Inj 2, Inj 3));
Services.Add<CursorInventory>(new CursorInventory(Inj 1,Inj 2, Inj 3));
Services.Add<ActionBarInventory>(new ActionBarInventory(Inj 1,Inj 2, Inj 3));
//PlayerUI
Services.Add<PlayerUI>(new PlayerUI(Inj 1,Inj 2, Inj 3);
Services.Add<InventoryViewManager>(new InventoryViewManager(Inj 1,Inj 2, Inj 3));
Services.Add<PlayerInventoryView>(new PlayerInventoryView(Inj 1,Inj 2, Inj 3));
Services.Add<CursorInventoryView>(new CursorInventoryView(Inj 1,Inj 2));
Services.Add<ActionBarInventoryView>(new ActionBarInventoryView(Inj 1,Inj 2, Inj 3));
Services.Add<StorageInventoryView>(new StorageInventoryView(Inj 1,Inj 2));
Services.Add<ActionBarSelection>(new ActionBarSelection(Inj 1,Inj 2, Inj 3));
Services.Add<CrossHair>(new CrossHair(Inj 1,Inj 2, Inj 3));
Unity 差異 - 僅在對我如何使用 Unity 進行實施感興趣時閱讀。
在統一中,您不能構建單一行為類。因此,您必須找到播放器上已經存在的所有依賴項。
我通過將 IService 介面添加到場景中的所有 Monobehaviours 來做到這一點。當 Player Spawns 進入服務器時,它會找到所有 IService,然后我將通過在每個 Service 上呼叫初始化函式來注入依賴項。
問題
在一個注入器類中構建大量服務是否正常?
如果我在這里有誤解,請糾正我。
uj5u.com熱心網友回復:
在一個類中構建注入是完全正常的,這實際上就是它的用途。您可以在一個地方輕松控制和查看您的依賴關系,但您應該知道,如果您的服務是單一行為的,那么它可能不是服務。該類通常也稱為背景關系,并且可以有多個背景關系。
您當前的注入不是服務,它們更像是玩家看到的視圖。通常,視圖不做邏輯,但單一行為也必須在視圖內部,如玩家運動。
您可以認為視圖是與統一相關的事物,并且您將與統一相關的事物鉗制為視圖。服務在游戲運行時被廣泛使用,并且沒有與統一性相關的東西。即用于 Steam、Epic 游戲、Xbox 等的 IAuthService 或用于不同作業系統的 SettingsService。
許多人將他們的類名命名為 PlayerController、UiManager/Service 卻沒有意識到。他們試圖實作的目標看起來總是 MVC,但方式很混亂。我所說的看起來也幾乎與 MVC(S) 相同。我認為你應該看看 MVC(S) 架構模式并獲得一些靈感。
已經有一個支持 MVCS IoC 的框架,它是Strange,你應該明確地檢查它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/528944.html
上一篇:當您按下選項卡時如何使UI設定處于活動狀態但如果它仍然處于活動狀態再次按下選項卡并且UI將在統一2dc#中設定為非活動狀態