LoginSignup
3
6

More than 5 years have passed since last update.

Unityで作る最強(当社比)のシーン管理 その2

Last updated at Posted at 2018-05-19

階層構造

今回は階層構造について説明します。

その1で何回か述べた通り、Routerを持つヒエラルキーは入れ子構造にできます。

nested_router.png

これによって、

/PageA/a/e
/PageA/b/f
/PageB/c
/PageB/d
/PageC

というパスでアクセスできることになります。もちろん、末端ノードでない/pageA/PageB/PageA/a/PageA/bにもJumpToできます。

enterとleave

パスヒエラルキーに含まれる各Routerは、enterとleaveという内部イベントを処理します。この知識はトリガを扱うときにも必要になることがあるので説明しておきます。

おおむね、JumpToである場所に来たらその場所にenterが、ある場所から離れるとその場所にleaveが発生すると考えて下さい。

例えば、まず

Routing.JumpTo("/PageA/a/e");

したとしましょう。次に、

Routing.JumpTo("/PageA/b/f");

したとします。

このとき、/PageA/a/eでleaveトリガが発生し、/PageA/b/fでenterトリガが発生します。

中間ノードにおけるenter/leave

routeneではさらに、上記のケースで、中間ノードであるabでもleave/enterが発生します。/PageAではenterもleaveも発生しません。この動きをファイルシステムのディレクトリにたとえて言うと、cdで一手ずつ相対移動するときの最短距離でのみ処理が行われると考えればよいかと思います。

例えば、/PageA/a/eから/PageA/b/fへの移動は、

  % cd ..
  % cd ..
  % cd b
  % cd f

となります。cd ..したときに移動前の場所でleaveが、cd <dir>としたときに移動後の場所でenterが発生します。

実装方法

routeneでは、このイベントの伝播のために、UniRxを使っています。具体的には、Router.csの以下のような定義によってです。

    [NonSerialized] public BehaviorSubject<Plan> enter =
        new BehaviorSubject<Plan>(null);
    [NonSerialized] public BehaviorSubject<Plan> leave =
        new BehaviorSubject<Plan>(null);

Routing.JumpTo("/A/B")のような要求がきたとき、Routingはこれを識別子のリスト["A","B"]に分解し、concreteRouterに渡します。

受け取ったRouterでは、リストの先頭を消費してのこりをthis.enterにUniRxのイベントとして発行します。子Routerは親のRouterのenter/leaveをStart時に自動的にObserveしますので、同様に再帰的に処理していきます。

なぜこのような構造にしたかというと、動的なmountを実現するためです。そのあたりは次回説明します。

leaveについては、enterと同じようなことを前回与えられたパスに対してenterの前に行うことで実現されます。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6