株式会社ミクシィさんで開催された『Unity Zenject完全に理解した』に行ってきたメモ。
配信アーカイブもあります。すばらしい。はじめ機材トラブル等ありますが解消します(ネタバレ
Zenjectとは、オープンソースのUnity向けDI(Dependency Injection)フレームワークです。 Zenject以前に「DIをよく知らない」という方は、まず、とりすーぷさんの『インタフェースの使い方』から見るのがいいでしょう。ここで、DIというものがなぜ必要か、なにを解決してくれるものか、がわかるはずです。
もし『インタフェースの使い方』が何を言っているのかわからないのであれば、今日のところはUnity仙人さんの『Zenjectはじめの一歩:ゲームデータをScriptableObjectでInject!』だけにしておくのがいいのではないでしょうか。
この手のツール・フレームワークは、手段から入ってしまうとマズロー*1の言う
ハンマーを持つ人にはすべてが釘に見える
状態に陥りがちです。
Zenjectのような強力な手段を乱用すると、結果的にそのデメリットだけがプロジェクトに残ってしまうことになりかねません。(完全に、とは言わないまでも)ある程度は理解した上で導入していくことをおすすめします。
ほんこれ #Zenject完全に理解した pic.twitter.com/rHE8trh2br
— デコシ (@Ash_Yin) 2018年9月6日
ゲーム案件にZenject導入した経験を語る
かせ(@KaseliaePenguin)さん
実際のプロダクトにZenjectを導入した経緯(目的)、試行錯誤したこと、どの範囲に適用すべきか、適用する上での注意点など盛りだくさん。
SceneContext
を4階層(System, Data, Env, Logic)にしてそれぞれの扱う範囲を明確化し、切り替え(本番とデバッグの置き換え等)を制御- Bind時の
AsSingle()
,AsCached()
,AsTransient()
の違い [Inject]
を書いたフィールドのバインドはnew()
の後に行なわれるSceneContext
の理解が大事- InjectするものにはInterfaceを切り、InterfaceをInjectすること
- Bindはリフレクションを使うので遅い
- 真価は運営フェーズに入ってからのはず
文脈を操る 美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜
Mikito Yoshiya(@mikito0521)さん
4種類あるContext
の階層構造と、またそれを入れ子にできる話、実際にリリース版とデバッグ用のContext
を切り替える例など。
Context
を意味のある単位に分割して切り替えるProjectContext
,SceneContext
,SceneDecoratorContext
,GameObjectContext
- それぞれ入れ子にできる
IDisposable
を実装すると、Context
が破棄されたタイミングでDispose ()
を呼んでくれる- 大事なのは
Installer
の設計。Context
との組み合わせ - 依存がわかりにくくなるので、
SceneContext
は二階層くらいにしておく。小さいものはGameObjectContext
にまわす
www.slideshare.net
インタフェース完全に理解した
とりすーぷ(@toRisouP)さん
C#のInterfaceの話。設計の話のほか、拡張メソッド、明示的な実装を書けるといった話。
- Interfaceには必ず利用者がいる。利用者側のPackageに置く。利用者側でコントロールできる
- 拡張メソッドに実装を書くことができる。traitっぽく使える
- structにInterfaceをかぶせる(実装する)ことができる
IEquatable<T>
を実装すると、Equals()
の振る舞いを自分で書ける
- 明示的な実装。
InterfaceName.MethodName()
と書ける。すると、Interfaceにキャストしないと呼べない
Zenject完全には理解できなかった〜実運用におけるアンチパターンとその回避策〜
のたぐす(@notargs)さん
実運用で問題となるアンチパターンの話。Zenject自体への依存を下げるMethod injectionや、処理負荷を考慮した適用範囲の話など。
- ZenAutoInjecter
- Method injection: フィールドでなく初期化メソッドに
[Inject]
を指定できる - MonoBehaviorをInjectするとき、
FromComponentInNewPrefab()
でなくFactory経由で行なう - 頻繁に使うものはプールする、そもそもDIしない
- pure C# classにのみ適用するほうがいい
- Zenjectはハイリスク、ハイリターン
Zenjectの機能をご紹介 〜テストの巻〜
@nozomin770 さん
Zenjectを適用したプロジェクトのEdit mode testで使うZenjectUnitTestFixture
および、Play mode testで使うZenjectIntegrationTestFixture
の話。
※スライドupされたら貼ります
Zenjectはじめの一歩:ゲームデータをScriptableObjectでInject!
Unity仙人(@lucifuges)さん
クラス設計など行なう前提でなく、データをScriptableObject
で持ち、それをScriptableObjectInstaller
で切り替える話。
所感
実際のプロダクトにZenjectを導入した経験談なども語られ、とても勉強になりました。皆さん、ただ「便利だよ」でなくデメリットにも言及されており、とても地に足の着いた内容だと感じました。 また、ContextやInterface、テストなど、それぞれフォーカスされた箇所が異なるセッションで構成されていたのもよかった。
自分ではまだ、DIが生きるほどの規模のものを作っていないのですが、今回の知見を取り入れて良い設計を目指していきたい。
参考
みなさんご参加ありがとうございましたー。Zenjectは中々国内記事が少なくこうやって知見が溜まるのは大変ありがたいので、どんどん公開して集合知集めていきたいですね。
— いも@efb~相手は死ぬ~ (@adarapata) 2018年9月6日
僕もUNIBOOK10にZenject書いたのでよかったらどうぞ(宣伝)https://t.co/VZNB1IMUBA
#Zenject完全に理解した
- 作者: 吉谷幹人,布留川英一,一條貴彰,西森丈俊,藤岡裕吾,室星亮太,車谷勇人,湊新平,土屋つかさ,黒河優介,中村優一,牙竜,コポコポ,かせ,hataken,monmoko,佐藤英一
- 出版社/メーカー: ボーンデジタル
- 発売日: 2018/05/01
- メディア: 大型本
- この商品を含むブログを見る