Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜

8,594 views

Published on

UnityにおけるZenjectのContextの扱い方に関して

Published in: Engineering
  • Be the first to comment

文脈を操る美しきZenjectプロジェクトからの眺め 〜Contextの扱い方と活用方法〜

  1. 1. 文脈を繰る 美しきZenjectプロジェクト からの眺め Contextの扱い方と活用方法 Mikito Yoshiya / @mikito0521 Zenject完全に理解した 2018/9/6
  2. 2. Mikito Yoshiya(ヨシヤミキト) ● ワンダープラネット株式会社 - タノシムスタジオ所属 ● Unityを使い始めて7年 ● Zenjectを使い初めて1年半 ● Twitter : @mikito0521
  3. 3. アジェンダ ● Contextとは何か ● Contextの基本的な使い方 ○ 種類と親子関係 ○ 動的生成とライフサイクル ○ 構築方法 ● Contextの具体的な活用案
  4. 4. Contextとは何か
  5. 5. ZenjectにおけるContext ● 内部のDIコンテナにコン ポーネントをBind ● なんでも依存解決してくれ る良い奴
  6. 6. ZenjectにおけるContext Component A Component B Context DI Container Resolve Bind Installer
  7. 7. Contextどう扱うべきか問題 ● 使いこなそうとしたときに正解がわからん ○ いろんなコンポーネントを一つのContextにBind ○ Bindしたいけど動的生成もしたい。どこまでBindすべき ○ 分割・Parenting複雑化。わけわからん
  8. 8. そもそも辞書的には:Context(文脈) ● 一般に、すじみち・脈絡。また、ある事柄の背景や周辺の状 況。文における個々の語または個々の文の間の論理的な 関係・続き具合。文の脈絡。(Weblio) ● 実行中のプログラムが処理内容を選択する際の判断の材 料となる、プログラムの内部状態や置かれた状況、与えられ た条件などを指すことが多い。(IT用語辞典)
  9. 9. 一般的なContext(文脈)の例 マック買おうぜ
  10. 10. 一般的なContext(文脈)の例 マック買おうぜ マック買おうぜ お昼時に 壊れたPCの前で
  11. 11. 一般的なContext(文脈)の例 マック買おうぜ マック買おうぜ お昼時に 壊れたPCの前で ハンバーガーを買う Macintoshを買う 後半の文章機能は全く同じだが、 前にくる「前提条件」で全く違う動きを見せる
  12. 12. プログラムでも様々な前提条件を扱っている 本番 サーバーで iOSにて Androidにて バトル シーンをUnity Editorにて 開発 サーバーで モック データで キャラ強化 シーンを 通常プレイ テストプレイ ● いろいろな文脈で個々のプログラムが起動
  13. 13. +プログラムの状態は変化する 本番 サーバーで iOSにて バトル シーンをプレイ キャラ強化 シーンをプレイ ● 末端の文脈が起動中に変化する
  14. 14. つまり プログラムの前提条件や内部状態を 明示的に分割したものがContextとみなせる
  15. 15. そして 分割したContextをスイッチすることで いろいろできるようになる
  16. 16. もう少し具体的な例 ● Contextが1つ ○ 同じ条件で常に起動 ○ 内部状態の区分も一つ Repository Context Base System アプリケーションを起動する UseCase Manager Inject Inject
  17. 17. もう少し具体的な例 ● Contextを分割してみる Sub Context Repository Root Context Base System アプリケーションを起動する UseCase Manager Inject Inject
  18. 18. もう少し具体的な例 Sub Context Inject ● RootのContextを変更することで、起動モードを変更 Repository Root Context Base System 本番プレイでアプリケーションを起動する テストプレイとしてアプリケーションを起動する UseCase Manager Mock Repository Mock Root Context Mock Base System Inject
  19. 19. ZenjectにおけるContextとは ● プログラムやシーンを起動する際の前提条件の集合 ● あるコンポーネント群が依存するコンポーネント群 ● 複数要素によって成り立つ内部状態の区分 Contextを意味のある単位で分割・スイッチすることで 柔軟なアプリケーションが実現できる
  20. 20. Contextの基本的な使い方
  21. 21. Contextの基本的な使い方 Contextの種類
  22. 22. Contextの種類(4種類) ● Scene Context ● Project Context ● Scene Decorator Context ● Game Object Context
  23. 23. Scene Context ● シーンに事前配置する最 も基本的なContext ● シーンと1対1で紐づく
  24. 24. Project Context ● Project全体で利用するも のをBindできる ● Scene ContextがRunする 前に自動的に生成される ● Resources以下にPrefabを 配置し事前設定できる
  25. 25. Scene Decorator Context ● シーンに事前配置、他の シーンのScene Context に追加でコンポーネント をバインドすることができ る(後述)
  26. 26. Game Object Context ● GameObjectの単位で存在 できるContext
  27. 27. Contextの基本的な使い方 Contextの親子関係
  28. 28. Contextの親子関係(Parenting) ● Contextは親を持つことが できる ● 子では親のContextを含め てリゾルブの処理が走る ● 親から子のContextにはア クセスできない Scene Context Project Context Game Object Context Scene Context Game Object Context
  29. 29. Project ContextとScene Context ● Project Contextはすべて のScene Contextの親にな る ● Project ContextにBindした ものはすべてのContextで Inject可能 Scene Context Project Context Game Object Context Scene Context Game Object Context
  30. 30. Scene ContextとScene Context(マルチシーン) ● Scene ContextのContract Names・Parent Contract Namesの設定で親子関係 が設定される ● 複数の親の設定も可能 ● 親シーンは事前にロードし ておく必要がある Scene Context Project Context Game Object Context Scene Context Game Object Context
  31. 31. Scene ContextとGame Object Context ● 配置されたシーンのScene Contextが親となる ● Game Object Context間の 親子関係はHierarchyに従う Scene Context Project Context Game Object Context Scene Context Game Object Context
  32. 32. Scene ContextのDecoration ● 対象のScene Contextを変 更なく機能追加等ができる ● 複数のシーンを同時に読 み込み合体させて起動す るケースやデバッグ機能の 追加等で利用できる Scene Context Project Context Decorator Scene Context Decorator Scene Context
  33. 33. Contextの基本的な使い方 Contextと動的生成
  34. 34. Zenjectにおける動的生成の基本 ● 動的生成かつDI Containerを利用するものはFactoryを利用 ● Factoryで生成したものはContextにBindされない ● 現在のContextを前提条件として動的生成物に依存を注入 [Inject] IComponentA ComponentB Context ComponentA Factory Inject
  35. 35. Scene Contextの動的生成 ● (当然だが)シーンのロード・アンロードにより制御 ● ロードタイミングや順番・依存に注意
  36. 36. Game Object Contextの動的生成 ● Game Object Contextをプレファブ化しFactoryを利用 ● FromSubContainerResolveとByNewContextPrefab等を利用
  37. 37. Context FromSubContainerResolve ● 指定したコンテナ内の何かをFacade(窓口)として解決をおこ なう Container Facade Component Sub Component Sub Component Resolve Component Resolve
  38. 38. Game Object ContextとFacadeとメリット Scene Component Scene Context Game Object Context Facade Component Sub Component Sub Component Resolve ● サブコンテナとして局所的なDIシステムが構築できる ● 利用者からするとContextかどうかは気にしない Use Scene Component Resolve
  39. 39. Contextとオブジェクトのライフサイクル紐づけ ● IDisposableの利用 ○ BindInterfacesToやBindInterfacesAndSelfTo等でBind ● Contextが破棄されたときに自動で呼ばれる ○ 内部状態の区分と処理・データが紐づく ○ Staticな実装よりはるかに安全
  40. 40. Contextの基本的な使い方 Contextの構築
  41. 41. ContextとInstallerの分割 ● Contextは意味のある複数の前提条件の集合 ● 使い回すInstallerを分割 ● Installerの組み合わせで異なるContextを準備できる App Context API Installer Game System Installer Standalone App Context Local Storage Installer Game System Installer
  42. 42. [Inject] IRepository 大事なのはInterfaceの設計 ● Interfaceをしっかり設計することは前提(Contextと関係ない) ● InterfaceによるInjectionによりContextスイッチを実現 Use Case Children Context InjectRepository :         IRepository Parent Context
  43. 43. ここまでまとめると ● Contextの種類と親子関係 ○ どんな状況でも変わらないもの:Project Context ○ 大きい粒度:Scene Context ○ 小さい粒度:Game Object Context ○ シーンを分割する場合等:Scene Decorator Context ● 動的生成はContextを前提条件としてFactory ○ さらにGame Object Contextを利用すると局所に対してもDI コンテナを利用できる ● Interface設計・Installerを分割して意味のあるContextを構築
  44. 44. Contextの活用案
  45. 45. 注意:あくまで提案 ● プロジェクトの構成案を1つ紹介 ● プロダクション・リリースレベルでの運用はこれから ● なんかできそうな例とかを提示 ● 様々な解釈とプロジェクトごとの適用があるはず
  46. 46. Contextの構成の例 Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Context (Game Object Context) Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository
  47. 47. Contextの構成の例:役割のいくつか Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository Server APIに依存し データCRUDの インターフェースを提供 Index View Context (Game Object Context)
  48. 48. Contextの構成の例:役割のいくつか Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository Repositoryに依存 データを取得して ビジネスロジックを実行 Index View Context (Game Object Context)
  49. 49. Contextの構成の例:役割のいくつか Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository シーンをロードしたり 制御する人 Index View Context (Game Object Context)
  50. 50. Contextの構成の例:ポイントのいくつか Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository プロジェクト全体で使う ものしかInstallしない Index View Context (Game Object Context)
  51. 51. Contextの構成の例:ポイントのいくつか Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository このシーンが LoadLevel0になることで 起動フローが決定 Index View Context (Game Object Context)
  52. 52. Contextの構成の例:ポイントのいくつか Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository アウトゲーム・インゲーム 等大きい内部状態の 区分をシーンコンテキスト として展開する Index View Context (Game Object Context)
  53. 53. Contextの構成の例:ポイントのいくつか Base System Project Context Server API Application Context (Scene Context) Scene Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator RepositoryFactoryにより Game Object Context による画面を動的に 起動 Game Object Context により画面単位の機 能を実現 Index View Context (Game Object Context)
  54. 54. 応用例1:プランナー用テストプレイモード Base System Project Context Mock Data Store Test Play Application Context (Scene Context) Test Routing Scene Management Battle Scene Context (Scene Context) Index View Factory Character Factory Index Presenter Index View Index UseCase Character Character (Game Object Context) Character Mover Animator Repository データの取得 コンポーネントを変更 直接目的のシーンを 起動しキャラや敵の 組み合わせなどを Editorで、すぐに設定 できるようにする Fixture Data Index View Context (Game Object Context)
  55. 55. 応用例2:デザインクオリティチェック実機確認アプリ Base System Project Context Mock Data Store Design Check Application Context (Scene Context) Check Routing Scene Management Check Scene Context (Scene Context) Character Factory CheckView クオリティチェック用 シーンにより専用アプ リケーションを構築 Fixture Data このシーンを LoadLevel0に 指定しビルド Character Character (Game Object Context) Character Mover Animator
  56. 56. その他の応用 ● プレイモードのランタイム切り替え ○ シングル・マルチプレイヤー(要インターフェース設計) ● チュートリアルフローの切り替え ○ チュートリアル用のPresenterを持つContext ○ 呼び出し先APIの切り替え
  57. 57. コンテキストを扱う課題と方針 ● Context間の依存がわかりにくい ○ 設計をしっかり、かつシンプルに努めるべし ○ SceneContextの階層化は2段階くらいが限度か ○ Validationの機能をつかう(自動テスト?) ● シーンの取り回しが難しい ○ シーンを管理する人をしっかり設計 ○ Game Object Contextの活用 ○ ZenjectDefaultSceneContractConfig(v6.1)の活用
  58. 58. まとめ
  59. 59. まとめ ● Contextは前提条件や内部状態の区分、そしてその依存を扱う ● Contextの利用は特徴と構成を意識 ○ 4種類のContext・Parenting ○ ライフサイクルとContextの構築方法 ● Contextのスイッチを利用した案を紹介 ○ 多様なユースケースに柔軟に対応できる可能性

×