Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

Unidux Scene Transition Hands-on / xrdnk-unidux...

Avatar for Denik Denik
July 28, 2021

Unidux Scene Transition Hands-on / xrdnk-unidux-scene-transition-hands-on

Avatar for Denik

Denik

July 28, 2021
Tweet

More Decks by Denik

Other Decks in Programming

Transcript

  1. 自己玹介 【名前 / Twitter】 Denik / @xrdnk 【職歎】 TIS 株匏䌚瀟

    19幎床入瀟 むンキュベヌションセンタヌ XR 新芏事業開発チヌム XR(VR/AR/MR) ゚ンゞニア 匊瀟のXR゜リュヌションサヌビス 「XR Campus」シリヌズの開発に埓事しおいたす 本発衚は個人の芋解です 所属組織の意芋云々ではありたせん
  2. ハンズオン資料の抂芁 ➢ 画面遷移に぀いお 「タむトル画面 ⇄ ゲヌム画面 → リザルト画面」に遷移したす ➢ タむトル画面に぀いお

    サヌドパヌティアセットラむセンス衚瀺ずゲヌム画面に移動する凊理がありたす ➢ ゲヌム画面に぀いお 神に攻撃する凊理ずタむトル画面に戻る凊理リザルト画面に移動する凊理がありたす ➢ リザルト画面に぀いお 神にどれだけダメヌゞを䞎えたのかを衚瀺する凊理ずタむトル画面に飛ぶ凊理がありたす
  3. Unidux React JS が扱う UI の State(状態)を 管理する Redux ずいうフレヌムワヌクがある

    Unidux は これを Unity で同じ感じに 扱えるようにした状態管理甚のラむブラリである Unidux = Unity 版 Redux ずいうより Redux-Like 今回は Unidux の Scene Transition を利甚しお画面遷移制埡をいい感じに䜜っおみたす 泚意 ① Unidux では内郚で UniRx が利甚されおいるので UniRx の基瀎知識は持っおいる前提になりたす 泚意 ② Unidux に様々なデザむンパタヌンを圓おはめおアレンゞしおいるため他解説蚘事ずは少し毛色が異なりたす 泚意 ③ 画面遷移機構に぀いおは各々オレオレ機構があるず思いたす 本機構に぀いおは飜く迄も個人的な䞀䟋でありこれが正解ずいう蚳ではありたせん https://github.com/mattak/Unidux
  4. 本ハンズオンのレベル感 ➢ Unity 䞭玚者皋床 ➢ UniRx UniTask を理解しおいる ➢ DiContainer

    (Zenject or VContainer) を理解しおいる ➢ Passive View Pattern を理解しおいる 䞊蚘を満足しおいるこずを前提に進めるので 䞊蚘に関するこずに関する説明は基本的にしたせん
  5. Store Unidux Pattern 構成 User Input Dispatcher Dispatch Action State

    Reducer Reduce Unidux Pattern Watcher Update ActionCreator View Event
  6. ハンズオンプロゞェクトの登堎人物たち Unidux 特有 ➢ Page / Scene ➢ PageData ➢

    State ➢ Watcher ➢ Reducer ➢ Store ➢ Dispatcher / Duck Pattern ➢ Action Creator ➢ Unidux Core 本プロゞェクト 固有 ➢ Progression ➢ Domain ➢ Service ➢ Application ➢ Contex ➢ Presentation ➢ View ➢ Presenter ➢ Navigator ➢ Transitioner ➢ LifeCycle
  7. Page / Scene (1) Concept ◆ Page Unidux では画面のこずを「Page」ず衚珟 ◆

    Scene ここの 「Scene」は Unidux の意矩 1 Page は n Scene (n≧1) を持぀ ◆ Scene Category ここの 「Scene」 は Unity Scene の意矩 Scene に 以䞋のカテゎリヌを定矩しおいる 1. Permanent → 氞続な Scene 2. Page → ペヌゞの䞀郚ずしおの Scene 3. Modal → オヌバヌレむな Scene Permanent は党 Page 共通に参照する Base Scene ≪Permanent≫ Title Page Header Scene ≪Page≫ Content Scene ≪Page≫ Footer Scene ≪Page≫ Main Page Header Scene ≪Page≫ Content Scene ≪Page≫ Footer Scene ≪Page≫ Result Page Header Scene ≪Page≫ Content Scene ≪Page≫ Footer Scene ≪Page≫
  8. Page / Scene (2) SceneConfig サンプルでは以䞋のように分類 Unidux Base Scene (共通参照シヌン)

    タむトル画面 ゲヌム画面 リザルト画面 Unidux Base Scene (共通参照シヌン) Page (タむトル → ゲヌム → リザルト)
  9. State 状態を持぀゚ンティティクラス矀を纏める圹 Unidux Scene Transition では Page ず Scene に

    Stateを持たせる 以降 ここでは State ずは Page / Scene の State を指す
  10. Watcher State の倉曎を監芖する圹 State の倉曎が発生したらView 偎に反映させる UniRx で State が

    倉曎されたのを監芖 倉曎されたら曎新凊理をする
  11. Reducer Dispatcher から届いた Action ず珟圚の State を受け取っお State を倉曎する圹 ref:

    Reduxのreducerはなんでreducerず呌ばれおいるのか https://shgam.hatenadiary.jp/entry/2018/11/10/004819
  12. Dispatcher Action Creator から受け取った Action を Reducer に枡す圹 ここで Action

    Creator ず Reducer を䞀纏めにしたものを Duck Pattern ずいう(認識です) Duck は以䞋を持぀ ◆ IAction ◆ ActionCreator ◆ IReducer Dispatcher Dispatch Action Reducer ActionCreator Duck
  13. Action Creator State を倉曎するような Action を䜜る圹 Unidux Scene Transition では

    以䞋の Action がデフォルトで提䟛されおいる ◆ Push State のプッシュ ◆ Pop State のポップ ◆ Replace State の眮換 ◆ Reset State のリセット ◆ SetData State を持぀゚ンティティクラスのデヌタのCreate/Update ◆ Adjust State の 調敎
  14. Unidux Core Unidux 管理甚のシングルトンクラス デフォルトで SingletonMonoBehaviour を継承 (これはこのたたでいい) Unidux Core

    は以䞋を持぀ ◆ IStoreObject (Store) ◆ State ◆ Subject<State> ◆ IReducer[] ◆ TextAsset (InitialStateJson) UniduxCore を通じお Dispatch をしおいく
  15. Progression ラむフサむクル凊理矀を定矩する圹 本ハンズオンでは以䞋のみを定矩しおいる ◆ IOrigination.Originate (初期化凊理) ◆ ITermination.Terminate (終端凊理) ◆

    IOrigination ITermination を持぀ IPeriod (「区切り」の抜象抂念) IAbortion.Abort (䞭止凊理) IResumption.Resume(再開凊理) 等もあるが今回は入れおいない MonoBehaviour を継承せずに Initialize/Awake/Start や OnDestroy/Dispose を行いたいクラスがある堎合 IPeriod を実装し Originate ず Terminate がマヌカヌメ゜ッドになる 小蚀: Initialize ではなく Originate にしおいるのは Zenject.IInitialize.Initialize() や VContainer.IInitialize.Initialize() ず被らせないようにするため
  16. Navigator Unity Scene 内に存圚する View 矀ずの間の行き来等の凊理を叞る ⚫ Unity Scene 内に

    View が 2぀以䞊存圚する時 Navigator を䜜る ⚫ Originate Terminate 凊理を持぀ INavigator を実装する ⚫ 基本的に MonoBehaviour を継承しない
  17. Transitioner Page ず Page たたは同䞀 Page 䞋における Scene ず Scene

    ずの間の行き来等の凊理を叞る ⚫ Project 内に Page が 2぀以䞊存圚する時 Transitioner を䜜る ⚫ 基本的に MonoBehaviour を継承しない
  18. 登堎人物たずめ (1) View View View Presenter Navigator Context Domain Transitioner

    Unidux Service Entity etc. Progression LifeCycle Presentation Application Page Unity Scene Repository Permanent Unity Scene
  19. 登堎人物たずめ (2) Context Domain Repository Service Entity etc. Progression LifeCycle

    Application Context Domain Repository Service Entity etc. Progression LifeCycle Application Domain Unity Scene Domain Unity Scene
  20. マルチシヌン構成 Entry Point Unity Scene Permanent Unity Scene Page Unity

    Scene Page Unity Scene Page Unity Scene Page Unity Scene Domain Unity Scene Domain Unity Scene Shared Unity Scene Domain Layer Scenes Shared Scenes Unidux Scenes Domain Scenes Shared Scenes Unidux Permanent Scene の順番を定めたり 党䜓蚭定の定矩を行う Unidux Scene Config で Unidux Page Scenes の蚭定 Shared Unity Scene
  21. Scene Config (2分) たずは SceneConfig.cs でシヌンカテゎリマップずペヌゞマップを蚭定したす ◆ シヌンカテゎリヌマップ IDictionary<SceneName, int>

    このシヌンは Permanent Scene なのか? Page Scene なのか Modal Scene なのか ◆ ペヌゞマップ IDictionary<PageName, SceneName[]> 1Page に察応する Unity Scene 配列を蚭定
  22. Unidux Core (2分) UniduxCore.cs に Reducer を蚭定したす 【埩習】 Unidux Core

    は以䞋を持぀ ◆ IStoreObject (Store) ◆ State ◆ Subject<State> ◆ IReducer[] ◆ TextAsset (InitialStateJson) UniduxCore を通じお Dispatch をしおいく
  23. Unidux Base Scene Unidux Base Scene の構成は右図のようになっおいたす 䞀旊 Main Camera

    Event System Static Env. 等を集玄しおいたす Unidux Core を通じお画面制埡・状態制埡管理を行っおいたす 1 Scene には必ず LifeCycle が存圚しおいお 各 Page Scene の LifeCycle は Permanent Scene の LifeCycle ず芪子関係になるようなむメヌゞです Unidux Base Scene は Page ではありたせんが たず最初にタむトル画面を衚瀺したいので ゚ントリヌポむントのような扱いで Transitioner を䜜成したす
  24. Base Scene Transitioner (分) 今回では Unidux Base Scene の圹割を Entry

    Point Scene か぀ Unidux Permanent Scene ずしおいたす BaseSceneTransitioner.EntryTitlePage メ゜ッドに タむトル画面に遷移するような凊理を蚘述しおください ① 最初にステヌトのクリヌンを実斜 クリヌンなのでどの Action を䜿うか ② 次にタむトル画面に遷移するようにステヌトを倉曎 次に遷移なのでどの Action を䜿うか Action Creator が提䟛されおいる Action 䞀芧は以䞋 Push, Pop, Replace, Reset, SetData, Adjust
  25. Title Page Navigator (2分) タむトル画面では今回 View が2぀以䞊存圚するので Navigator を䜜成しおいたす [SHOW

    LICENCE] ボタンをクリックした時に ラむセンス画面が衚瀺され [HIDE LICENCE] ボタンをクリックしたら 閉じるようにしおみたしょう
  26. Title Page Transitioner (3分) タむトル画面からゲヌム画面に画面遷移出来るようにしたす TitlePageTransitioner.EntryMainPage に 遷移凊理を行いたす ① MainPage

    は 今回 PageData を持぀ので PageData のむンスタンスを䜜成したす コンストラクタには倀の初期蚭定が行われおいたす ② ActionCreator から次に遷移する Action を 䜜り UniduxCore で Dispatch したす
  27. Main Page Service (5分) MainPageServiceの䞭身を芋おたす 初期化・終端凊理ず神に攻撃する凊理がありたす ① ここで初期化の際 MainPageData から

    デヌタを受け取る必芁がありたす ヒント PageData を取埗しおいる API がないか調査しよう ② 神に攻撃する凊理を行う際に MainPageData の GodHP ず DamageDone の 曎新凊理を行う必芁がありたす ヒント ActionCreator の Action 䞀芧を眺めおみよう
  28. Main Page Transitioner (5分) ゲヌム画面での画面遷移制埡を実装したす 今回ゲヌム画面ではタむトル画面ぞ戻る遷移ず リザルト画面に遷移する2぀の遷移方法がありたす MainPageTransitioner.cs の EntryResultPage

    ず ReturnTitlePage に凊理を入れたす ① 珟状の MainPageData を取埗し぀぀ リザルト画面に遷移するようにディスパッチ ② タむトル画面(前の画面)に戻るようにディスパッチ
  29. おわりに Unity の開発は倚皮倚様でこれずいったフレヌムワヌクやアヌキテクチャが決たっおなく Unity 偎も実装がカオスであるこずを前提に䜜られおいたす シヌン遷移の API も SceneManager.Load/LoadAsync 皋床しかなくお

    状態制埡ずかアドバンスな遷移方法は Unity 偎から䞎えられおいたせん ゲヌム業界でも画面遷移機構ずいうのはオレオレ実装で䜜られおいるようで これずいった解はなくそしおその解を公開しおいるずころはあたりありたせん その解の䞀぀に Unidux を䜿っおみた感じです シヌン制埡・状態制埡の方法の唯䞀解ではないです
  30. 参考資料 ➢ 【Unity】Redux のように状態管理できる「Unidux」玹介 https://baba-s.hatenablog.com/entry/2018/02/20/085900 ➢ 【Unity】単䞀シヌン/マルチシヌンで良い感じに状態管理がしたい https://qiita.com/genkitoyama/items/0ef2cc8927b84c10e947 ➢ Uniduxでゲヌムサむクルを実装する

    https://tech.mobilefactory.jp/entry/2018/12/10/163322 ➢ Unidux Repo Unidux Repo 内に Examples があるのでそちらも参考にしおもいいかも (本プロゞェクトでは削陀しおいたす) https://github.com/mattak/Unidux