Slide 1

Slide 1 text

Three-Sacred-Treasures and MV(R)P Pattern 三種の神器とMV(R)Pパターン Workshop and Hands-on

Slide 2

Slide 2 text

教材サンプルの動画 以下のリポジトリを事前にcloneしてください. https://github.com/xrdnk/Three-Sacred-Treasures-Hands-on

Slide 3

Slide 3 text

アジェンダ ➢ 軽く自己紹介 ➢ 本ハンズオンの目的 ➢ UniRx (Unity Reactive Extension) and MV(R)P Pattern ➢ UniTask (an efficient allocation free async/await integration for Unity) ➢ Extenject (Zenject Dependency Injection IOC / ex: Zenject) and DI Pattern ➢ 終わりに ➢ Bonus Track : VContainer (extra fast Dependency Injection for Unity)

Slide 4

Slide 4 text

自己紹介

Slide 5

Slide 5 text

PERSONAL INFO 😀 Name Denik Hatsushika Twitter XR Account: xrdnk GitHub xrdnk Blog デニッキ!

Slide 6

Slide 6 text

本ハンズオンの目的

Slide 7

Slide 7 text

皆さんは神クラスを 作っちゃっていませんか?

Slide 8

Slide 8 text

問題提起 1クラスにロジック処理・入出力処理・リソース処理…. こういうクラスは神クラス (God Classes) と呼ばれます. 実体は悪クラス (Evil Classes) です. Unity 初心者本は大方神クラスで説明を済ませることが多く,「密結合」になりがちです. 個人開発ならいいですが,実際のチーム開発では「密結合」である場合は困ることが多いです. ワシに任せろ かかったな アホが ! 神クラスに見えて 実際は悪クラスである

Slide 9

Slide 9 text

神クラスのざっとしたサンプル UIコンポーネント群 リソース群 ドメインロジック UIのビジネスロジック

Slide 10

Slide 10 text

問題点 ➢1クラスに依存しすぎているため,一部変更しただけで全体に影響を及ぶ. ➢ ビジネスロジック処理の追加・削除がしにくい. ➢ UIを変えたい・切り替えたい時も面倒になる. ➢ チーム開発時にみんな同じクラスに手を入れるとコンフリクトし,解決が面倒. ➢ 拡張・分割しにくい.例えば攻撃・回復・死亡はプレイヤーだけじゃなくて,他のオブジェクトも出来る. ➢ 単純にコードが長くなって,コードリーディングする気力を失う. ➢ 単純に汚いコードになりやすい etc.

Slide 11

Slide 11 text

本ハンズオンの目的 ➢ 疎結合なコードが書けるようになる ➢ 責務範囲を意識した設計が出来るようになる ➢ 代表的なデザインパターンを習得する ➢ 巷でUnity開発によく利用されるライブラリを習得する

Slide 12

Slide 12 text

UniRx and MV(R)P Pattern

Slide 13

Slide 13 text

What is MV(R)P Pattern (1/3) quoted by https://developers.cyberagent.co.jp/blog/archives/4262/

Slide 14

Slide 14 text

What is MV(R)P Pattern (2/3) quoted by https://developers.cyberagent.co.jp/blog/archives/4262/

Slide 15

Slide 15 text

What is MV(R)P Pattern (3/3) quoted by https://developers.cyberagent.co.jp/blog/archives/4262/

Slide 16

Slide 16 text

そこで UniRx

Slide 17

Slide 17 text

What is UniRx Unity でReactive Extensions(Rx)を実現するためのライブラリ イベントや値の変化を自動で伝播させることができる 作者は neuecc さん. C# で言う event をストリーム化した概念のような感じ. Operator (LINQ) が使えるので 中身の加工も容易に出来て柔軟性がある 今回は「使い方」の簡単な説明しかしません. 詳しい機能の中身や概念を深堀したい場合は, 最後に載せる参考資料を読んでください.

Slide 18

Slide 18 text

UniRxで出来ること(一部) ➢ Method Chain でイベントに対する処理をキレイに書ける ➢ Plain C# Class で Update などの MonoBehaviour ライフサイクル処理が実行できる ➢ Scheduler を利用すれば, Coroutine を使わなくても Timer 処理が可能 ➢ ReactiveProperty を利用すれば, 普段の変数感覚でイベントの通知が実装出来る ➢ uGUI のイベント処理が簡潔にキレイに書ける ➢ イベントに対する加工が出来る (Where, First, Select, SelectMany...)

Slide 19

Slide 19 text

Twitter で覚える UniRx の概念 (1/8) 突然ですがみなさん Twitter を利用していますか? (私はバリバリ仕事中もプライベートもやってます) Twitter のフォロー・フォロワー・ツイートの仕組みを思い出してみましょう.

Slide 20

Slide 20 text

Twitter で覚える UniRx の概念 (2/8) ファン(フォロワー) アイドルのTwitter フォロー フォロー フォロー

Slide 21

Slide 21 text

Twitter で覚える UniRx の概念 (3/8) ファン(フォロワー) アイドルのTwitter TLに通知される おはよう ^^ みんな元気~!? Tweet TLに通知される TLに通知される

Slide 22

Slide 22 text

Twitter で覚える UniRx の概念 (4/8) 流れを整理します. ① アイドルのTwitterアカウントが存在する ② ファンがアイドルをフォローする ③ ファンはアイドルのフォロワーになる ④ アイドルがツイートする ⑤ フォロワーはTLにツイート内容が流れてくる この時,アイドルはフォロワーの存在がいる,いないにかかわらず, 「Tweet」というイベントを行うことが出来ますよね ? そして, フォロワーはその「Tweet」内容をTLで拾うことが出来,読むことが出来ます. (ここでアイドルが鍵垢ではないこと,アイドルにブロックされてないことを考慮しない) これを UniRx の用語で当てはめます(アナロジー)

Slide 23

Slide 23 text

Twitter で覚える UniRx の概念 (5/8) 流れを整理します. ① アイドルのTwitterアカウントが存在する (Observable:観測可能) ② ファンがアイドルをフォローする (Subscribe:購読する) ③ ファンはアイドルのフォロワーになる (Observer:観測者) ④ アイドルがツイートする (OnNext:発行する・通知する) ⑤ フォロワーはTLにツイート内容が流れてくる (SubscribeしているのでOnNextを検知出来る)

Slide 24

Slide 24 text

Twitter で覚える UniRx の概念 (6/8) Observer Observable Subscribe Subscribe おはよう ^^ みんな元気~!? Tweet OnNext Subscribe Tweet Message

Slide 25

Slide 25 text

Twitter で覚える UniRx の概念 (7/8) quoted by https://qiita.com/toRisouP/items/2f1643e344c741dd94f8

Slide 26

Slide 26 text

Twitter で覚える UniRx の概念 (8/8) quoted by https://qiita.com/toRisouP/items/2f1643e344c741dd94f8

Slide 27

Slide 27 text

MV(R)P Pattern is quoted by https://developers.cyberagent.co.jp/blog/archives/4262/ view. xxxxAsObservable() Subscribe (model.method) Subscribe (view.method) model. xxxxAsObservable()

Slide 28

Slide 28 text

例題(ハンズオン)

Slide 29

Slide 29 text

Subject Subject は IObservable と IObserver を実装するクラスです. 通知側で Subject を作成し, IObservable で公開します. 通知を行う際は, OnNext を行います. 購読側は IObservable を参照し, 通知が届いたら Subscribe で購読します. Subscribe は IObserver を引数に持つので, ここで購読時に行う処理を行います. 何言ってるんだコイツは…? となると思うので,例題を出します. 例題1 は私が実演します.例題2 ~ 4 は各自で実装を行ってもらいます.

Slide 30

Slide 30 text

事前準備 ハンズオンプロジェクトを開いてください. ➢ ハンズオン用のシーン UniRxExample/Scenes/00_Question ➢ ハンズオン用のスクリプト UniRxExample/Scripts/0X_QuestionX Answer フォルダもありますが,最初は見ないようにしましょう. 自身で問題を解いて,合っているかどうかの確認のために利用しましょう. どうしても問題がわからない場合は,参照してもかまいません.

Slide 31

Slide 31 text

問題1| Subject を利用して Hello World を表示する ボタンを押したら, Debug.Log で Hello World ! を表示してみましょう.

Slide 32

Slide 32 text

解答1| Subject を利用して Hello World を表示する ボタンを押したら, Debug.Log で Hello World ! を表示してみましょう.

Slide 33

Slide 33 text

問題2|問題1の責務範囲を分ける 1クラスに Observable と Observer がいることになるので, Observable と Observer を分けましょう. Observable でボタン発火のイベントを発行し, Observer でボタン発火の通知を購読し, Debug.Logで Hello World!を表示します.

Slide 34

Slide 34 text

解答2|問題1の責務範囲を分ける

Slide 35

Slide 35 text

Reactive Property Reactive Property は Subject を 通常の変数感覚で行えるようにした変数のようなものです. // int型のReactiveProperty var rp = new ReactiveProperty(10); //初期値を指定可能 // Value プロパティを通して,普通に代入したり、値を読み取ることができる rp.Value = 20; var currentValue = rp.Value; //20 // Subscribeもできる(Subscribe時に現在の値も発行される) rp.Subscribe(x => Debug.Log(x)); // 値を書き換えた時にOnNextが飛ぶ rp.Value = 30; quoted by https://qiita.com/toRisouP/items/86fea641982e6e16dac6

Slide 36

Slide 36 text

問題3|Reactive Property でカウンタを作る ボタンを押した時に,カウンタがインクリメントする処理を Subject と Reactive Property を組わせて実装してみよう.

Slide 37

Slide 37 text

解答3|Reactive Property でカウンタを作る

Slide 38

Slide 38 text

問題4|問題3 を MV(R)P パターンで実現する 問題 3 を MV(R)P パターンで実現しましょう.(復習の図) quoted by https://developers.cyberagent.co.jp/blog/archives/4262/ view. xxxxAsObservable() Subscribe (model.method) Subscribe (view.method) model. xxxxAsObservable()

Slide 39

Slide 39 text

解答4|問題3 を MV(R)P パターンで実現する Model ドメインロジックがあるだけ. ユーザ側が知らなくていい部分. 受け取った入力に色々処理を行い 結果を出力するだけ.

Slide 40

Slide 40 text

解答4|問題3 を MV(R)P パターンで実現する View UIのビジネスロジックがあるだけ. UIの表示 入力の発火点 出力の表示 ユーザー側に見せる部分

Slide 41

Slide 41 text

解答4|問題3 を MV(R)P パターンで実現する Presenter Model と View の橋渡しをする 橋渡しの際に色々加工をしてもよい. (例えば遅延処理,ライフサイクル調整など) UniRx の Operator で 渡ってくる値のフィルタリングも行う.

Slide 42

Slide 42 text

Model-View-(Reactive)-Presenter Pattern 復習 quoted by https://developers.cyberagent.co.jp/blog/archives/4262/ view. xxxxAsObservable() Subscribe (model.method) Subscribe (view.method) model. xxxxAsObservable()

Slide 43

Slide 43 text

DQEmulation(所要時間15分?) 問題 1: MPの概念を追加し,回復呪文を唱えた時に,MPを減らすようにしよう. コメントアウトしている部分を参考にやってみましょう.

Slide 44

Slide 44 text

UniTask

Slide 45

Slide 45 text

What is UniTask Unity C# 用にチューニングされた非同期処理用のライブラリ 最近 Unity C# は async/await Task 使えるようになったが,パフォーマンスに問題あり. UniTask を利用することで解決できる. quoted by https://speakerdeck.com/torisoup/unitask2020

Slide 46

Slide 46 text

Coroutine の問題点 Unity C# で非同期を実装する際に Coroutine を利用することがある. Coroutine の場合,コールバック地獄になりやすい.そして,コード的に汚い. quoted by https://speakerdeck.com/torisoup/unitask2020

Slide 47

Slide 47 text

UniTask Example ➢ 名前空間 (UniTask 2 からの変更) using UniRx.Async; → using Cysharp.Threading.Tasks; private async UniTaskVoid Hoge() { // 1秒待つ await UniTask.Delay(TimeSpan.FromSeconds(1)); // 1フレーム待つ await UniTask.DelayFrame(1); // 1フレーム待ってUpdate()のタイミングまで待機 await UniTask.Yield(); var flag = true; // 条件がtrueになるまで待つ await UniTask.WaitUntil(() => flag); flag = false; }

Slide 48

Slide 48 text

事前準備 ハンズオンプロジェクトを開いてください. ➢ ハンズオン用のシーン UniTaskExample/Scenes/00_Question ➢ ハンズオン用のスクリプト UniTaskExample/Scripts/0X_QuestionX Answer フォルダもありますが,最初は見ないようにしましょう. 自身で問題を解いて,合っているかどうかの確認のために利用しましょう. どうしても問題がわからない場合は,参照してもかまいません.

Slide 49

Slide 49 text

例題1|Coroutine を UniTask 2 にする

Slide 50

Slide 50 text

解答1|Coroutine を UniTask 2 にする

Slide 51

Slide 51 text

例題2|UnityWebRequestのダウンロード進捗率の表示をMV(R)Pで実装

Slide 52

Slide 52 text

例題2|UnityWebRequestのダウンロード進捗率の表示をMV(R)Pで実装 やること ➢ Presenter View ⇆ Model の橋渡し処理を行う ➢ Model ① 取得したいコンテンツのURLを設定する (今回は設定済) ② UnityWebRequest.Get(url) で GET する ③ 受信を待つ (await する) ④ SendWebRequest は AsyncOperation なので, ToUniTask() に変換できる ⑤ UniTaskの Progress.Create(x => _progress.Value = x * 100) を利用して 現在のダウンロード進捗の値を取得する

Slide 53

Slide 53 text

解答2|UnityWebRequestのダウンロード進捗率の表示をMV(R)Pで実装

Slide 54

Slide 54 text

Extenject

Slide 55

Slide 55 text

What is Extenject Unity C#用の Dependency Injection (依存性注入) ライブラリ. 必要な物を注入してくれるイメージ. (Dependency Injection Pattern, Service Locator Pattern については今回説明しません.) FYI : Service LocatorとDependency InjectionパターンとDI Container https://www.nuits.jp/entry/servicelocator-vs-dependencyinjection もともとは Zenject [Zen (禅の心) + ject (Inject) ] だったが, 色々事情(裁判中)があり Extenject と言ったほうがよい. 今回は最低限の部分の簡単な説明しかしません. 詳しい機能の中身や概念を深堀したい場合は, 最後に載せる参考資料を読んでください. (というより多機能すぎて未だに全て把握できていない)

Slide 56

Slide 56 text

とりあえず簡単な利用方法を説明 Presenter は Model, View の橋渡し役なので,両方知る必要がある(依存している). 現時点では, Model, View を知るために, [SerializeField] アトリビュートを加えて, Inspector 上で設定している. この, Presenter に Model, View に参照を与える際に, [SerializeField]を用いずに, Extenject を用いる方法でやってみましょう. Extenject の専門用語があるので,まずは用語整理をします.

Slide 57

Slide 57 text

現状 Scene (Hierarchy) Model Presenter View [SerializeField] [SerializeField]

Slide 58

Slide 58 text

Extenject の基本的な流れ (イメージ) Scene (Hierarchy) Scene Context Installer Model Presenter View Bind Bind Model View Inject Inject

Slide 59

Slide 59 text

Scene Context まずは Scene Context を作ります.Context は 「文脈」という意味ですね. Hierarchy 上で右クリックし, Zenject > Scene Context で作成できます.

Slide 60

Slide 60 text

Installer 次に MonoInstaller を作ります. MonoInstaller は MonoBehaviour を 継承した Installer です. よって, Hierarchy 上に実体があります. Projects ウィンドウで右クリック > Create > Zenject > MonoInstaller すると, MonoInstaller.cs を作成できます. InstallBindings() メソッド内で 注入(Inject) したいクラスを Bind します. MonoInstaller を Scene Context に 設定するのを忘れず!(忘れると動きません)

Slide 61

Slide 61 text

Bind (MonoBehaviour 継承クラス) Fooクラスの依存性注入メソッド Container.Bind().AsCashed(); IFoo インタフェースには Fooクラスを注入する Container.Bind().To().AsCashed(); Fooインスタンスを注入する Container.BindInstance(_Foo).AsCashed(); Bind の仕方については沢山設定方法があるので,ドキュメントを読んでください() 以下,参考. 【Unity】【Zenject】Containerでバインドする際の設定まとめ https://light11.hatenadiary.com/entry/2019/02/22/005845 【Unity】【Zenject】いろんなものを依存性注入する https://light11.hatenadiary.com/entry/2019/02/20/234834

Slide 62

Slide 62 text

Inject ➢ フィールドインジェクション (循環参照問題により避ける) [Inject] private Bar _bar; [SerializeField] と同じ感じだと思えばよい. ➢ プロパティインジェクション (循環参照問題により避ける) [Inject] public Hoge hoge {get; private set;} ➢ メソッドインジェクション (循環参照問題が起きてしまうが… MonoBehaviour クラスはこちらを利用) [Inject] private void Construct(Model model){} ➢ コンストラクタインジェクション (Plain C# クラスはこちらを利用する) [Inject] (一応コンストラクタインジェクションの場合は [Inject]を付けなくてよい) private Boo(Model model){}

Slide 63

Slide 63 text

Extenject の基本的な流れ (再録) Scene (Hierarchy) Scene Context Installer Model Presenter View Bind Bind Model View Inject Inject

Slide 64

Slide 64 text

事前準備 ハンズオンプロジェクトを開いてください. ➢ ハンズオン用のシーン ExtenjectExample/Scenes/00_Question ➢ ハンズオン用のスクリプト ExtenjectExample/Scripts/0X_QuestionX Answer フォルダもありますが,最初は見ないようにしましょう. 自身で問題を解いて,合っているかどうかの確認のために利用しましょう. どうしても問題がわからない場合は,参照してもかまいません. SceneContext, Installer 設定は事前に済ませています.

Slide 65

Slide 65 text

例題1|UniRxの例題4にExtenjectを利用しよう Presenter をいじります. Installer を新しく作ります.

Slide 66

Slide 66 text

解答1|UniRxの例題4にExtenjectを利用しよう 解答例 (Bind の仕方は色々ありますが,以下が単純)

Slide 67

Slide 67 text

例題2| Model の MonoBehaviour をなくそう Model は正直 MonoBehaviour を継承する必要がない. MonoBehaviour の継承をなくすことで, Hierarchy 上に実体が必要なくなる. Plain C# クラスの Bind をしてみよう.

Slide 68

Slide 68 text

解答2| Model の MonoBehaviour をなくそう

Slide 69

Slide 69 text

閑話休題 Model に MonoBehaviour を継承すべきかどうかはプロジェクト次第ですが, ドメインロジックを担当するなら,個人的には継承しないのが責務範囲的に正しいと思います. ただ諸々の事情により,MonoBehaviour を継承してしまっても良い時もあります. ここは個人個人の経験と肌感覚によります. また,Presenter はModel と View の橋渡し役なので MonoBehaviour を最終的には継承する必要はありません. ただ今回では MonoBehaviour のライフサイクルに利用される Awake(),Start() メソッドを利用しているため,継承している形です. Extenject には IInitializable のインタフェースがあるので, Presenter に MonoBehaviour を継承させずに, Initializable.Initialize() で実装するのが美しいです. (今回は時間がないので,PresenterもMonoBehaviourを継承させた形で進めます.)

Slide 70

Slide 70 text

脳死でMonoBehaviourを継承していませんか? MonoBehaviour を継承しているクラスは,以下の特徴があります. 1. Hierarchy上に実体が必要. 2. MonoBehaviour ライフサイクルを利用することができる. Awake(),Start(),Update() など. 3. コンストラクタメソッドを作ることができません.なので,new Bar() ができない. MonoBehaviour はコンストラクタメソッドを利用できないので, メソッドインジェクションで疑似的に Inject させる運用になります. Extenject (VContainerも) を利用すれば, MonoBehaviour 継承不要なクラスも 疑似的に Awake(),Start(),Update() のような処理が出来るので,便利です.

Slide 71

Slide 71 text

Extenject (VContainer) を利用することの個人的な利点 Extenject (VContainerも) を利用すれば, MonoBehaviour 継承不要なクラスも 疑似的に Awake(),Start(),Update() のような処理が出来るので,便利です. MonoBehaviour の特徴に合わせて照らし合わせます. ◆ Hierarchy上に実体が必要. → Hierarchy上に実体が不要.よって,いちいち空オブジェクトを生成して, スクリプトをアタッチする手間が省けるし,抜け漏れを防ぐことができる. ◆ MonoBehaviour ライフサイクルを利用することができる. Awake(),Start(),Update() など. → Zenject.IInitializable.Initialize(), Zenject.ITickable.Tick() を利用すればいい. ◆ コンストラクタメソッドを作ることができません.なので,new Bar() ができない. → コンストラクタが利用できるので,コンストラクタインジェクションが出来る. コンストラクタインジェクションの場合,明示的に [Inject] を書く必要がない.

Slide 72

Slide 72 text

終わりに

Slide 73

Slide 73 text

Pros (Personal View) ➢ チーム開発で大いに役に立つ ➢ 設計が疎結合になりやすい ➢ コードの可読性が高い ➢ 採用例が多い (MESON Inc. は採用条件に Extenject の知識が必要とも書かれている) quoted by https://www.wantedly.com/projects/568250

Slide 74

Slide 74 text

Cons (Personal View) ➢ 学習コストが高い(ただ身に着ければ,その分のリターンは大きい) ➢ フィーリングで UniRx を使ってしまうとリアクティブスパゲッティになりがち ➢ 短期開発のような拡張性を考える必要のない場面では冗長すぎる ➢ 機能が多すぎてどの道具を利用した方がよいかわからなくなる ➢ 三種の神器なしのコードが書けなくなるし,読むスピードも遅くなる チーム開発で UniRx, UniTask, Extenject を利用する場合は チームメンバーのレベル感, 開発納期, 今後の拡張性等を考慮して使うこと バリバリ使う必要はないし,最初は最低限の箇所から利用していくのがよい

Slide 75

Slide 75 text

まとめ ➢ UniRx, UniTask, Extenject の紹介と軽い使い方の説明 ➢ MV(R)Pパターンの概念の説明 ➢ 実際にハンズオンで三種の神器と MV(R)P パターンの効力を実感させた

Slide 76

Slide 76 text

VContainer (Bonus Track)

Slide 77

Slide 77 text

What is VContainer HadashiA さんが昨年リリースした Unity用のDIライブラリ. Extenject より 10倍早い. (実は Extenject は遅い)

Slide 78

Slide 78 text

Extenject と VContainer の比較 (1/2) ➢ Code のサイズ quoted by https://vcontainer.hadashikick.jp/comparing/comparing-to-zenject

Slide 79

Slide 79 text

Extenject と VContainer の比較 (2/2) API はだいたい似通っています. quoted by https://vcontainer.hadashikick.jp/comparing/comparing-to-zenject

Slide 80

Slide 80 text

VContainer の基本的な流れ (イメージ) Scene (Hierarchy) LifetimeScope Model Presenter View Register(Bind) Model View Resolve(Inject) Register(Bind) Resolve(Inject)

Slide 81

Slide 81 text

LifetimeScope LifetimeScope.cs を作る. スクリプト作成の時に,XXXXLifetimeScope と命名するとテンプレートが自動的に当てはめられる. 雑だが,LifetimeScope は SceneContext と Installer が合体したようなものだとここでは理解してください.

Slide 82

Slide 82 text

事前準備 ハンズオンプロジェクトを開いてください. ➢ ハンズオン用のシーン VContainerExample/Scenes/00_Question ➢ ハンズオン用のスクリプト VContainerExample/Scripts/0X_QuestionX Answer フォルダもありますが,最初は見ないようにしましょう. 自身で問題を解いて,合っているかどうかの確認のために利用しましょう. どうしても問題がわからない場合は,参照してもかまいません. LifetimeScope 設定は事前に済ませています.

Slide 83

Slide 83 text

例題1| ボタンを押したら Hello World Model,View, Presenter は設定済.LifetimeScope を編集しよう.

Slide 84

Slide 84 text

解答1| ボタンを押したら Hello World Model,View, Presenter は設定済.LifetimeScope を編集しよう.

Slide 85

Slide 85 text

例題2| Extenject 例題 2 を VContainer にする Extenject の Question 2 のシーンをコピーして, Extenject から VContainer のスクリプトの変更しましょう.

Slide 86

Slide 86 text

解答2| Extenject 例題 2 を VContainer にする

Slide 87

Slide 87 text

今回のクラス図(参考)|概説 Entity (Scriptable Object) マスターデータ Repository CRUD Model ドメインロジック View UIビジネスロジック Presenter 仲介者 Domain Layer Presentation Layer 例えばQuest版,HoloLens2版, Mobile版 のUIを変える場合は Concreate View さえ差し替えればよい Entity, Repository について今回説明せず 他にも Infrastructure Layer があるが,今回は説明せず. たとえば Multiplayer によるネットワーク接続や Database による サーバデータベース接続 など

Slide 88

Slide 88 text

今回のクラス図(参考)|詳細 PlantUML でクラス図を作成しています Entity, Repository, Service, Domain の 用語の使い方は他では解釈が異なる場合があります

Slide 89

Slide 89 text

DQEmulation(所要時間30分?) BGMの実装を参考にして, 問題 2: SFX(効果音)の概念を追加し, 攻撃・回復・被弾時にSFXを鳴らすようにしましょう. 問題 3: SFX の音量を調整する機構を作成しましょう.

Slide 90

Slide 90 text

参考資料

Slide 91

Slide 91 text

参考資料 ➢ MV(R)P パターン ➢ Web出身のUnityエンジニアによる大規模ゲームの基盤設計 https://developers.cyberagent.co.jp/blog/archives/4262/ ➢ UniRxでMV(R)Pパターンをやってみた https://www.slideshare.net/torisoup/unirxmvrp ➢ UniRx ➢ UniRx入門シリーズ (qiita) https://qiita.com/toRisouP/items/00b8a5bb8e7b68e0686c ➢ UniRx/UniTask完全理解 より高度なUnity C#プログラミング (書籍) https://www.amazon.co.jp/dp/B08MNQT86F ➢ UniTask ➢ UniTask2の使い方 https://speakerdeck.com/torisoup/unitask2020 ➢ UniRx/UniTask完全理解 より高度なUnity C#プログラミング (書籍) https://www.amazon.co.jp/dp/B08MNQT86F UniRx, UniTask は neuecc さん, torisoup さんのブログ,qiita,書籍を読めば網羅できる

Slide 92

Slide 92 text

参考資料 ➢ Extenject (Zenject) と DI Pattern ➢ Zenject入門その1 疎結合とDI Container https://qiita.com/toRisouP/items/b3d3c43db40857ca4ad4 ➢ ZenjectチョットワカルBook https://booth.pm/ja/items/1520608 ➢ 【Unity】依存性注入とは?と、なっているのでZenject(Extenject)を入門してみた https://qiita.com/4_mio_11/items/4306732bc47780802b74 ➢ VContainer ➢ Unity専用最速DIコンテナVContainer と、UnityにおけるDIの勘所 https://learning.unity3d.jp/6297/ ➢ 【Unity】DIコンテナVContainerの使い方まとめ https://light11.hatenadiary.com/entry/2021/02/01/203252 ➢ VContainer入門 – MVPパターンを組んでみる https://gaprot.jp/2021/02/18/vcontainer/ ➢ その他 ➢ Unityにおける設計パターン (必読) https://speakerdeck.com/torisoup/unityniokerushe-ji-patan