Zenject – Example1 przegląd

category

c#

author

admin

tags

Zenject

W tym pościQ odpowiemy sobie na pytania jak działa 1 example w Zenject. W tym przykładzie jest nie tylko ciekawie i w miarę przystępnie pokazane jak używać Zenjecta, ale jest też sporo ciekawych koncepcji np. użycie wzorca projektowego stan w przypadku statku.

Opiszę różne ciekawe rzeczy które znalazłem w tym przykładzie.

Settings

Jest dużo klas Settings które są zagnieżdzone w innych klasach. Np. AsteroidManager.Settings, Asteroid.Settings, ShipStateDead.Settings.

Te wszystkie klasy settings są potem dodane do kontenera za pomocą Container.BindInstance. One są dodane w ScriptableObjectInstaller aby można je było w inspektorze uzupełnić.
Jest to też ciekawie zrobione w tym instalerze, bo jest w tym celu stworzona klasa z atrybutem [Serializable] fajnie uzupełnialna w Inspektorze grupująca:

No i same klasy:

Przykład jak taki stworzony ScriptableObjectInstaller wygląda:

 

W przykładzie zdecydowanie preferowane jest wstrzykiwanie zależności poprzez parametry w konstruktorach. W przypadku Monobehaviour używane są funkcje z [Inject] a nie pojedyncze pola w klasie z atrybutem [Inject]

[Inject] można robić także w instalerach!

Jakie mamy installery?

SceneContext ma 2 installery.

ScriptableObjectInstaller z parametrami typu maxspeed i prefabami asteroidy i wybuchów i zniszczonego statku. Jest tam również prefab statku, ale wygląda na to, że nie jest nigdzie używany. Statek jest od razu na scenie.

Drugi installer jest dodany do SceneContext i jest podzielony na części:

InstallAsteroids():
– Instaluje AsteroidManagera który odpowiada za tworzenie asteroid. AsteroidManager dostaje również Settings w ctorze() z parametrami asteroid (ten settings ze ScriptableObjectInstallera)
– Instaluje również fabrykę do tworzenia asteroid. Tą fabrykę wykorzystuje AsteroidManager. Fabryka nie ma parametrów. Jak zatem asteroidom podawane są parametry typu prędkość?

Ano najprościej jak się da: Fabryka wypluwa nową asteroidę, a potem się jej podaje parametry:

Ja to bym pewnie kombinował jak tutaj te parametry do fabryki wrzucić, albo do konstruktora Asteroidy, ale w sumie można i tutaj. Można dyskutować nad tym czy to dobre miejsce dla logiki odpowiedzialnej za ustawianie parametrów asteroidy, ale w sumie nie najgorsze.
Tak samo dodanie ich do listy. Są po prostu dodane do listy. Najprościej.

InstallShip()
Ten installer odpowiada za binding fabryki stanów statku. Ma jeszcze jakiś sygnał, ale to olewam. używam zwykłych eventów. Może później do tego wrócę. Ale to CHYBA działa jak zwykły event.

instaluje również stany statku do fabryki, ale też samą fabrykę. ShipStateFactory to normalna klasa, która zawiera fabryki stanów które są wstrzykiwane zenjectem (standardowe fabryki z Create())

InstallMisc()
Pozostałe bindingi: dźwięk, Funkcje pomocnicze do kamery (nie istotne…) oraz jest binding GameControllera.

Cóź ów GameController robi?
Tu jest logika zmiany stanu gryOn ma enuma GameState

Leave a comment