CAFU v3 完全に理解した / Updates for CAFU v3

7b13f432547b92d04c79b749adb535e0?s=47 Tetsuya Mori
October 02, 2018

CAFU v3 完全に理解した / Updates for CAFU v3

2018/10/02 (Tue) に開催した、キッズスター開発合宿 vol.6 での資料です。
CAFU: Clean Architecture for Unity の v3 に関するアップデート情報などを軸に Zenject についても解説しています。

スクリーンキャプチャ動画も撮影しているので以下にリンクします。

- [Changes](https://youtu.be/snavhGhm6cc)
- [Zenject](https://youtu.be/mO2BN6foSMg)
- [処理の流れ](https://youtu.be/B4_wlM3KEXs)
- [v2 と v3 の移行・共存](https://youtu.be/w_RNPdJVJ3w)

7b13f432547b92d04c79b749adb535e0?s=128

Tetsuya Mori

October 02, 2018
Tweet

Transcript

  1. 12.

    wOBNFTQBDFϨϕϧͰ෼͚Δ͔Ͳ͏͔ ͸ࣗ͝༝ʹ 12 Entity ͱ Data Structure ͷ෼཭ About CAFU

    v3 > Changes > Split Entity and DataStructure W 㱺 W .PEFM 㱺 %BUB4USVDUVSF
 GPS1SFTFOUBUJPO-BZFS &OUJUZ 㱺 %BUB4USVDUVSF
 GPS%BUB-BZFS
  2. 20.

    w*OTUBMMFSʹ4FSJBMJ[F'JFME࡞ͬͯɺͦ ΕΛͦͷ··'SPN*OTUBODF ʹ౉͢ 20 γʔϯ্ͷཁૉΛ Bind ηΫγϣϯλΠτϧ [SerializeField] private ButtonStart

    buttonStart; private ButtonStart ButtonStart => buttonStart; Container.Bind<ITrigger>() .WithId(Constant.InjectId.ButtonStart) .FromInstance(ButtonStart) .AsCached();
  3. 22.

    22 Prefab ͔Βͷ Spawn Process flow [SerializeField] private Mole molePrefab;

    private Mole MolePrefab => molePrefab; [SerializeField] private Transform moleParent; private Transform MoleParent => moleParent; public override void InstallBindings() { Container // IMoleView の Factory を登録 .BindIFactory<int, IMole, IMoleView>() // Mole 型として .To<Mole>() // MolePrefab 内のコンポーネントを用いて .FromComponentInNewPrefab(MolePrefab) // MoleParent の配下に .UnderTransform(MoleParent);
 }
  4. 23.

    23 Prefab ͔Βͷ Spawn Process flow [Inject] private IFactory<int, IMole,

    IMoleView> MoleViewFactory { get; } private List<IMoleView> MoleViewList { get; } = new List<IMoleView>(); public void Instantiate(int index, IMole mole) { var moleView = MoleViewFactory.Create(index, mole); MoleViewList.Add(moleView); } w͜ͷྫͷ৔߹ɺ1SFTFOUFSͰ4QBXO ͍ͯ͠Δײ͡
  5. 28.

    28 UI γʔϯ ηΫγϣϯλΠτϧ [SerializeField] private SceneStrategyList sceneStrategyList; private ISceneStrategyList

    SceneStrategyList => sceneStrategyList; public override void InstallBindings() { // シーン読み込みに関する処理群を Install // Generics ナシの SceneInstall の場合 SimpleLoaderUseCase が Bind される // PreLoad/PostUnload の設定を流し込みたいので StrategicLoaderUseCase を利用 SceneInstaller<StrategicLoaderUseCase>.Install(Container); Container.QueueForInject(SceneStrategyList); // シーン読み込み戦略データを Bind // PreLoad/PostUnload の設定を仕込む Container .Bind<IDictionary<string, ISceneStrategy>>() .WithId(CAFU.Scene.Application.Constant.InjectId.UseCase.SceneStrategyMap) .FromInstance(SceneStrategyList.AsDictionary()); }
  6. 31.

    31 σʔλಡΈॻ͖ Process flow // Repositories Container .BindInterfacesTo<AsyncCRUDRepository>() .AsCached(); //

    DataStores Container .BindInterfacesTo<AsyncLocalStorageDataStore>() .AsCached();
  7. 32.

    32 σʔλಡΈॻ͖ Process flow [Inject(Id = Constant.InjectId.ResultListFileUri)] private Uri ResultListFileUri

    { get; } [Inject] private IAsyncCRUDHandler AsyncCRUDHandler { get; } private async void Read() { var bytes = await AsyncCRUDHandler.ReadAsync(ResultListFileUri); RankingEntitySubject.OnNext( ResultListEntityTranslator.Translate( bytes.FromByteArray<DataResultList>() ) ); RankingEntitySubject.OnCompleted(); } private async void Write() { // 念のため ResultListEntity の生成準備を待つ await RankingEntitySubject; await AsyncCRUDHandler.UpdateAsync( ResultListFileUri, DataResultListStructureTranslator.Translate( RankingEntitySubject.Value ).ToByteArray() ); }
  8. 34.
  9. 35.

    35 v2 ɾ v3 ͷڞଘ Migration & Coexistence w"TTFNCMZ%FpOJUJPO'JMFTΛ෼͚ͯ ͋ΔͷͰ҆৺҆શ

    wಉ࣌ʹ࢖͏৔߹JOUFSGBDFͷީิ͕
 ྆ํͷόʔδϣϯͷιϨ͕ग़ͯ͘Δ
 ͷͰ*%&্ͰΠϥοͱ͢Δ͔΋