Unity + Doozy UI ManagerでUI制御をわかりやすく作るならこれだけは覚えておけ！集

こちらはUnityのアドベントカレンダー2022の3日目の記事です。

今回は普段お世話になっているDoozy UI Managerの紹介をどどんとしようと思います！
欲張ってアセット自体の紹介や、覚えておきたい項目の紹介、導入手順、便利な機能紹介などモリモリにしてしまいました。
導入手順と、実際に簡単な遷移を作成してみる　では前提知識なしでも読めるように書いてあります！

環境
Unity 2022.1.14f1
Doozy UI Manager 4.6

# Doozy UI Managerとは
Unityのアセットで、アセットストアから購入できます。

https://assetstore.unity.com/packages/tools/visual-scripting/doozy-ui-manager-203601

注意点として、今回紹介するのは2021年後半に発売されたバージョン4系の`Doozy UI Manager`で、以前のDoozy UI（バージョン3系以下。現在は販売終了しているようです）は互換性がないので注意です。

## できること
Doozy UI Managerでは以下のようなことができます。
- UIを組む上で便利なUI制御コンポーネントを使用できる
- ビューの遷移をフローグラフを使って定義・制御できる
  - ここで言うビューの遷移は、シーンの遷移ではなく一つのシーン内での画面遷移のことを指しています
- 自作UIコンポーネントをわかりやすく管理できる

## メリット
自分が個人的にDoozy UI Managerを導入するメリットはこんな感じかな～と思っています。
- UI制御用コードを書かなくてよくなる
- フローグラフでビュー遷移が可視化されるのでわかりやすい
- よくある必要なUIの機能が揃っている(ので自分で開発しなくてよい)
    - アニメーション、効果音再生、コールバックなど
- アップデートが頻繁に行われており、新しいコンポーネントも追加されている

## デメリット
- Doozy UI Manager独自のUI製作ワークフローを理解する必要がある(そりゃそうだ)
- 画面遷移を組むまでのステップがそれなりにある
    - 最初は覚えるのが若干大変かもですが、慣れれば早くてわかりやすいです
- 人によりそうですが、使用しない機能がたくさん出てきてしまい無駄にスクリプトなどが増える

## ここがう～ん
ちょっと微妙な点も挙げてみます。
- [ドキュメント](https://www.doozyui.com/docs/documentation/)自体は用意されているんですが、内容が乏しかったりサイト自体が激重な時があったり...
- アセットの内容物にエディターUI用(Doozy側のシステム内で使用)の画像が大量に含まれます。そこまでアニメーションしなくてもいいんじゃないか...と思ってしまいます
- 2022/11時点で$99とちょっとお高め。セールを狙いましょう

# Doozy UI Managerでこれだけは覚えておけ！集
Doozy UI Managerを使う上で必須な要素を紹介していきます。
導入する手順や実際に画面遷移を作ってみる手順を早く見たい方は、目次から飛んでくださいね！→

## UI識別子データベース
Doozy UI Managerでは基本的に、データベースに登録したUI識別子をもとに画面遷移などの挙動の制御を行います。

例えば`Aという画面のボタンaを押すと画面Bに遷移する。`
という場合を考えると、
- 画面A
- 画面B
- ボタンa

をデータベースに登録する必要があります。
Unityにて`Tools→Doozy→Dashboard`をクリック、開いた画面で`Databeses`を選択するとデータベースを編集できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/a22a1d40-5c51-ee2d-4ca3-625420fef213.png)
データベースには大カテゴリがあり、ボタン(Buttons)や画面(Views)、トグル(Toggles)などがありそれぞれ対応するコンポーネントに対して設定できる識別子を定義できます。

また、Doozy UI ManagerにはSignal/Streamという仕組みがあり、任意のタイミングで送信できるイベントのような仕組みです。
これを利用する際にも、データベースの`Streams`に追加する必要があります。

## 基本UIコンポーネント
この節では、Doozy UI Managerでよく使用するUI系コンポーネントを紹介します。
これらのコンポーネントは後で紹介する画面遷移を作ってみるときにも登場するので、そちらも参考にしてみてください～
### UIView
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/d4820636-caa9-f1d3-110d-66a4e4c716ec.png)
「画面」(ビュー)を表すために使用するのが`UIView`です。
上の画像の最下部にある設定で、先ほどのデータベースで登録した識別子を割り当てて使います。
よく使う設定項目はこんな感じです。
- OnStart：このビューの初期状態を定義します。
  - たいていの場合は、`Instant Hide`(隠す)もしくは`Instant Show`(表示)を指定すると思います。
  - `Hide`と`Instant Hide`の違いは、(ビューを隠す)アニメーションを再生するかどうかです。
- When Hidden, disable：隠すor無効状態の時の挙動を定義します。
  - デフォルトだと`Canvas`と`GraphicRaycaster`が有効になっていて、例えばビューが非表示になった時に、UIViewと同じオブジェクトにアタッチされた`Canvas`と`GraphicRaycaster`のenableがfalseになります。
  - `GameObject`を有効にすると、ビューの非表示時にGameObjectが非アクティブ化します。

### UIButton
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/7e3a1072-be81-8ef8-a0f1-18e30625d3e7.png)
UIButtonはuGUIで言うButtonの役割と一緒です。
こちらにも、データベースに登録した識別子を指定することができます。
識別子を指定することで、「～のボタンを押したときに～する」という挙動を作るときに、該当のボタンを指定できるようになります。

uGUIのボタンと同様、各イベントのコールバックを設定することもできます。
「Behaviours」のタブを開いて、「Available Behaviours」から追加したいイベントを指定、`+ Add Behaviour`ボタンを押すと登録できます。(最後のボタン押し忘れ注意)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/a975582a-71e2-a46f-7202-00c06c2fe218.png)
uGUIのボタンと同様に、GUI上からコールバックを登録することもできますが、コード上からもコールバック設定することができます。
これがちょっとややこしいですが、以下のようにすればOKです(PointerClick使用する場合)。
(コードでコールバックを設定する場合も、上記の手順でイベント(PointerClickなど)を追加する必要があります)
```C#
using Doozy.Runtime.UIManager;
using Doozy.Runtime.UIManager.Components;
...
uiButton.behaviours.GetBehaviour(UIBehaviour.Name.PointerClick).Event.AddListener(OnClickButton);
```
また、UIButtonは対応するコンポーネントを追加することで様々な設定ができます。
たとえば、ボタンの状態に応じたアニメーション設定や、サウンド設定などです。
後で紹介します！

## フローグラフ
Doozy UI Managerではフローグラフを使って画面遷移の流れを定義することができます。
フローグラフでは、UIの状態を表すノードをつなぎ合わせて画面遷移を表現します。
例えば、下記の画像左側はView1とView2の画面遷移をボタンによって行うフローグラフです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/5da72e58-50e4-8255-0b7b-d4ce2dd9b5fa.png)
ちょっと色が薄くてわかりづらいですが、四角いノードが相互に線につながれて遷移が定義されています。

### Flow Graphアセット
フローグラフを使用するには、FlowGraphアセットを作成する必要があります。
Projectビューで`Create→Doozy→Flow Graph`で作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/f03c83ce-3591-7784-f7ab-d0c84603256a.png)
このアセットをダブルクリック、もしくは`Tools→Doozy→Nody→Window`でフローグラフを編集するためのNodyウィンドウが開きます。

さらに、ゲーム内でフローグラフを再生させるためには、`FlowControllerコンポーネント`に作成した`Flow Graphアセット`を設定してあげる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e4838dc1-8e86-a23c-62e7-6f61a9e105e3.png)

### よく使うノード
フローグラフでよく使用するノードを紹介します。
- `UIManager/UI`ノード
    - ビューの表示/非表示を定義
    - 次のノードに遷移するための条件を設定(ボタンが押された、ビューの表示/非表示、トグルのON/OFF、signalなど)
- `UIManager/Portal`ノード
    - 特定の`UIManager/UI`ノードに強制遷移させる
    - トリガーは`UIManager/UI`ノードと同様の種類がとれる

**UIノード**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/5afcc309-9ff5-e26f-ac40-6b0657913953.png)
フローグラフ上のUIノードをクリックすると、Inspectorに設定項目が表示されます。
UIノードは頻繁に使用する、ビューの状態を定義するためのノードです。

`On Enter Node`、`On Exit Node`それぞれでノードに入ってきたとき・出たときのビュー表示の状態(表示するor非表示にする)を定義できます。
ここでビューを指定する方法は、前の節で登場したデータベースに登録された識別子の設定をすることです。

また、ちょうど`On Enter Node`の項目の上で、このノードから次のノード(右側に線が結ばれたノード)に遷移する条件が設定できます。
上の画像だと、「GoView2」という`UIButton`を押したら遷移　という設定になっています。
`UIButton`のほかに、`UIToggle`(トグルがON/OFFになったとき)、Signal(イベント的なやつ)などで遷移条件を設定できます。

**Portalノード**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/fecb9462-4996-253f-fea0-d6ccce53d90d.png)
Portalノードは、設定した条件が満たされると強制的に次のノードに遷移させるためのノードです。
基本的にフローグラフは、最初から存在しているStartノードから開始して順に遷移していくのですが、Portalノードを使用するとその流れに反して強制的に状態を遷移させることができます。

上の画像だと、`UIButton`の`GoView1`が押されると次のノードに遷移するように設定されています。


## Signal/Stream
Doozy UI ManagerにはSignal/Streamという仕組みがあります。
これは、前にも軽く触れていると思いますが、C#における`event`の仕組みと似ています。
任意の場所で`Stream`を作成(取得)して、`Signal`を待ち受けて処理を行うことができる仕組みです。
この仕組みを使うと、例えばコード中の任意の場所で`Signal`を発火させて、UIの遷移を発生させるといったことができます。

### Stream識別子をデータベースに追加する
Signal/Streamの仕組みを使うためには、まずデータベースに`stream`の識別子を登録する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e5898832-ee48-ad67-52ac-33e66f1ce6fb.png)

### Signalの発火
`Signal`の発火は主にフローグラフを使用するか、コード上で行うことができます。
- フローグラフの`UIManager/Signalノード`を使用
- コードからSignalクラスを使用

以下のコードでSignalを発火することができます。
```C#
using Doozy.Runtime.Signals;
...
Signal.Send(streamCategory, streamName);
```
単に発火するだけでなく、情報を持たせたSignalも発火させることができるようですが、ここでは省略します！

### StreamでSignalを待ち受ける
Signalが発火したタイミングで処理を実行するには、StreamでSignalを待ち受ける必要があり、こちらも複数の方法があります。
- フローグラフで`Portalノード`、`UIノード`を使用して遷移条件をSignalに設定する
- コードでStreamを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/9927466f-af5c-1ab5-975a-976227d71cf6.png)
ややわかりづらい例ですが、↑のように`Portalノード`の遷移条件にSignalを指定しています。
このように設定すると、該当のSignal(今回はSampleSceneカテゴリのSampleSceneStream01)が発火した際、Portalノードに接続されたUIノードに遷移します。

また、コード上でStreamを取得、Signalを待ち受ける場合は以下のように記述します。
```C#
using Doozy.Runtime.Signals;
...
// Streamを取得
SignalStream signalStream = SignalStream.Get(streamCategory, streamName);
// Signalを受け取るインスタンスを作成、コールバックを設定
SignalReceiver signalReceiver = new SignalReceiver().SetOnSignalCallback(OnSignalCallback);
// SignalReceiverとSignalStreamを紐づける
signalStream.ConnectReceiver(signalReceiver);
```
コード上でSignalを待ち受ける際の注意点として、適切なタイミングでコールバックの設定を解除してあげないと、ずっとコールバックが登録されっぱなしになる点です。
例えば、あるGameObjectがSignal待ち受けをしていて、ある時Destroyされたとしてもコールバックの情報が残ったままになり、Signalが発火した際にエラーとなってしまいます。
GameObjectが削除されたときなどに、コールバックの解除をしてあげると良いと思います。
```C#
private void OnDestroy()
{
    SignalStream signalStream = SignalStream.Get(streamCategory, streamName);
    // signalReceiverはインスタンス変数などで保持しておく
    signalStream.DisconnectReceiver(signalReceiver);
}
```

## 便利コンポーネント
専用のコンポーネントでよく自分も使用しているコンポーネントを紹介します。

:::note
この節では、後の項目で作成する画面遷移サンプルを使用して設定例などを示す場合があります
:::

### UI Container UI Animator
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/8af58446-19bd-5dc9-a19e-9c7f7f85188e.png)
このコンポーネントは、`UIContainer`専用のアニメーションコンポーネントです。
`UIContainer`は、わかりやすく言うと`画面`を表すコンポーネントで、前の節で扱った`UIView`は`UIContainer`を継承しています。
そのような継承関係なので、この`UIContainerUIAnimator`コンポーネントは、`UIView`でも使うことができます。

:::note info
ちなみに、UIContainerとUIViewの違いは、識別子を設定できるかどうかということらしいです。
識別子がいらないビューを作りたいときはUIContainerを使うとよさそうです。
:::

`UIContainerUIAnimator`は、ビューを表示するとき・非表示にするときのアニメーションが定義できます。

**使い方**
`UIView`(UIContainer)と同じGameObjectにアタッチして使うと良いです。
（Container変数の設定で別階層のオブジェクトのUIContainerを指定することもできます）

例えば、後の項目で作成するView2を画面遷移の際に下から上にアニメーションして表示するようにするにはこんな感じで設定します。
- View2 GameObjectに`UIContainerUIAnimation`コンポーネントをアタッチ
- Show→Moveとメニューを開いて、「Move From」を`Bottom`に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/f5578709-aded-5b1c-6be8-1110f80443f8.png)

これだけで、こんな感じになります。
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/22f88d9a-6890-d4b9-ba9c-06fe60005c8a.gif)

View1は消えるときパッと消えるので、背景が見えちゃっているのがイケてないですが、これも`UIContainerUIAnimator`でいい感じにすれば自然になります。
ちなみに、View2から遷移するとき右側に画面が移動していますが、これはHideのアニメーションがデフォルトで設定されているからですね。

アニメーションは、移動のほかに回転や拡大縮小、フェードなどがそれぞれ設定できるので色々試してみてください！

また、Doozy UI Managerにはアニメーションのプリセットがたくさん用意されており、「Presets」タブから設定できます。
定番のものから、いつ使うの！？というものまでたくさんありますよ。

プリセットを使うときの注意点として、Preset Category・Preset Nameを選んだあとに、「Load Preset」ボタンを押して読み込んであげる必要があります。
そのボタンを押すと、移動や回転などのパラメーターが自動で設定されるという仕組みです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/21712fa4-514a-c1a0-0e7a-37c79c97b626.png)

### UI Selectable Color Animator

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/f39fb77a-d5ed-706c-a26d-6973d1b424e1.png)
こちらのコンポーネントは、選択ができるUI専用の色アニメーションを設定するためのものです。
選択できるUIというとよくわからないと思いますが、クリックしたりホバーしたりすると反応するUIに適用できるという認識でよさそうです。

具体的には、`UIButton`によく使うコンポーネントかなと思います。
ボタンが押されたとき、フォーカスが当たっているとき、押された後のタイミングの色を指定できます。
このコンポーネントを`UIButton`と同じGameObjectにアタッチすると、Imageの色に応じて自動的に各状態の色が割り当てられます。
もちろん、自分で色を変えることもできます。

後で作成する画面遷移サンプルにて、View1に配置されたUIButtonに`UISelectableColorAnimator`をアタッチするとこんな挙動になります。
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/1612b949-6332-2688-ff4d-8ff0381f9282.gif)

アタッチするだけで色が変わるアニメーションをしてくれるのはありがたいですね。

### UI Selectable UI Animator

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/ba5a4edd-60b4-574f-4cf2-d21a8cd06759.png)
こちらは、UISelectable系のアニメーションコンポーネントで、`UISelectableColorAnimator`が各状態の色アニメーションを設定できるのに対して、こちらのコンポーネントは各状態の時のアニメーション(移動・拡縮・回転など)を設定できます。

こういうよくある拡縮のアニメーションも設定できますね～
![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/43d51ed2-111f-16e6-0392-da0c1607763e.gif)

### UI Tab
こちらはアップデートで追加されたコンポーネントで、タブ切り替えで画面を切り替えることができるものです。

こちら、設定してしまえば納得の設定なのですが、最初はちょっと分かりづらいかもです。
簡単に設定の仕方を説明します。
タブの構造を作るためには、以下のコンポーネントが必要です。
- `UIContainer`(UIViewでも可ですが、遷移にフローグラフを使わないのでUIContainerの方が設定が増えなくてよいと思います)
- `UITab`
- `UIToggleGroup`

`UITab`はUIToggleを継承していて、トグルの動きを利用してタブ切り替えを実現しているので`UIToggleGroup`が必要になります。

↓を参考に、`UIContainer`・`UIToggleGroup`・`UITab`を配置、設定します。
![Qiita2022AdventCalender_Tab01_text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/a114a43c-2c6b-5bcb-15a5-0cc3ec0b60a5.png)

次に、Tabを設定します。
UITab1の「Toggle Group」には、Tabsにアタッチされている`ToggleGroup`を指定します(他二つのUITabにも同様に設定)、「Target Container」にはUIContainer1を指定します。
このように設定すると、UITab1をクリックするとでUIContainer1が表示されるようになります。
同じように、UITab2にはUIContainer2を、UITab3にはUIContainer3を指定します。
![Qiita2022AdventCalender_Tab02_text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/3e5db40f-a6c2-0a8d-b094-65c380506aab.png)

この状態で再生してみましょう！
これだけでタブ切り替えで画面を切り替えることができます。
![ezgif.com-gif-maker (4).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/4f4de55d-9244-28da-52c0-23638cfa2bb7.gif)

**アニメーションの設定**
タブで切り替えられるようになりましたが、今どのタブを選んでるかわかりづらいのでアニメーションを適用しましょう。
`UITab`のON/OFF時のアニメーションを制御するには、`UIToggleColorAnimator`もしくは`UIToggleUIAnimator`コンポーネントを使用します。
`UIToggleColorAnimator`を使って色だけ変えてみます。

各`UITab`に`UIToggleColorAnimator`をアタッチして、Onの時の色をいじりましょう。
To ColorのLightness Offsetを大きくして、オンの時は明るくなるようにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/87b3ab9f-bb7d-77bc-deaf-6c2a5a388c77.png)

また、`UIToggleGroup`のFirst ToggleにUITab1を指定しておくと、最初に選択されるタブを指定できるので設定しておくとよさそうです。
これで再生してみると...
![ezgif.com-gif-maker (5).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/50b8e44b-49df-cfdd-0e44-234ea77cdf4c.gif)

いい感じですね～
フローグラフを設定しないでも画面を切り替えられるので、これは便利ですね。


# Doozy UI Managerを使ってみる
ここからは実際にDoozy UI Managerを使っていきます！
## 導入する
導入手順は、公式でも解説されています。(めっちゃ簡単ですが...

https://www.doozyui.com/docs/getting-started/

まずはパッケージマネージャーからインポートしましょう。
インポートすると、新しい`Input System`を導入してくれと言われるので、素直に`Yes`をクリックします。
（既に導入済みの人は次の手順に進んでOKです）
![doozy_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/a64900b4-5978-82e3-4c77-32ad29b48ce2.png)

:::note info
古い方のInput systemにも対応はしているっぽいです。`Tools/Doozy/Dashboard`の`Settings→Input Settings`で新旧どちらを使用するか切り替えることができるようです（動作未確認です）
:::

上記のダイアログのあと、新しいInput Systemが導入されるとUnityが再起動されると思います。
再起動した後、Doozy UI Managerは導入されていないので、もう一度パッケージマネージャーからインポートしましょう。

インポート出来たら、公式のGetting Startedに従って`Tools/Doozy/Refresh/Global Refresh`をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/b4df5df7-b78c-43aa-3acc-df8c1e46d745.png)
そうすると、ダイアログが二回出るとおもうので、どちらも`Yes`をクリックしましょう。
![doozy_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/538e2871-c919-e716-b64f-88ea05c0c9ad.png)
![doozy_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/a50c81f1-4a83-cc08-a7c7-8e30e7d4cd8e.png)
何やら読込が走ったりコンパイルが走ったりするので少し待ちます。
これで導入は完了です！

:::note info
Doozy UI Managerをインポートすると、`Doozy/_Examples`にサンプルが配置されています。様々なコンポーネントの使用例が存在するので、見てみましょう。
サンプルの中には`TextMeshPro`の導入が前提になっているものもあるので注意です。
:::

## 簡単な画面遷移を作ってみる
まずは二つの画面を行ったり来たりできる画面遷移を作ってみましょう。
(ちなみに自分はURP環境で進めています。基本的にはビルトイン・HDRPでも変わらないと思います)

こんな感じのものが出来上がります。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/c6e99980-f702-b5d1-e1f9-b64a26020562.gif)

画面遷移を作るために必要な作業は大まかにこんな感じです。
1. ヒエラルキーにビュー(画面)を作成、Doozy UI Managerの専用コンポーネントをアタッチする
1. ビューやボタンを表す識別子をデータベースに登録する
1. フローグラフを編集して画面遷移の流れを作成
1. 2.で定義した識別子をコンポーネントに設定

正直道のりは長いんですが、慣れるとササっと設定できるので最初は覚えるまで辛抱しましょう...!

### 画面の準備
まずは画面遷移させる画面を二つ作りましょう！
シーンに`Canvas`とその子供に`空のGameObject`を配置します。
空のGameObjectのNameを`View1`に変更、`Image`コンポーネントをアタッチしてColorを好きな色に変えます。
大きさも画面いっぱいになるように大きくしました。
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/4a6d4c1c-3742-98e1-befe-b8b20b99c107.png)
次に、画面遷移のトリガーとしてボタンを使いたいので、Doozy UI Managerのコンポーネントである`UIButton`を配置しましょう。
`View1`の子供に、右クリックメニューから`UI/Components/UIButton`をクリックして追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/73436005-2b36-a7c0-ef5f-bd189f604232.png)
そうすると、`UIButton`がアタッチされただけのGameObjectが追加されます。
ボタンには`Image`コンポーネントが必要なので、アタッチしてあげましょう。
お好みでテキストを子オブジェクトに付けたり、大きさや位置を調整してください。
ここまでで、こういう感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/f2f95ad8-15c7-a824-1c16-408a99a4659b.png)

次に、今までと同じ要領で`View2`を作りましょう。
さっき作成した`View1`の上に被るように作ります。
`View1`を複製して、名前を変えて各種色を変えるだけでもOKです！
ここまででこういう感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/0209cc0f-69de-90ac-02d7-446bcd889be2.png)

### DBにビューとボタンを登録する
**ビューの登録**
Doozy UI Managerでは、画面(ビュー)遷移を行う際にDB(データベース)に登録した名前をキーに指定して遷移を行うことができます。
先ほど作成した二つのビュー名をDBに登録します！

:::note warn
ここで登録するのは、あくまでビューやボタンを示す識別子です。定義した識別子を別途専用のコンポーネントと紐づけることでフローグラフと連動して機能するようになります。
:::

`Tools/Doozy/Dashboard`をクリックしてダッシュボードを表示します。(初回はちょとだけ開くのに時間がかかるかもです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/63434b59-f21f-299e-4519-7e516ce21a9f.png)
ダッシュボードが開いたら、`Databases`→`Views`をクリックしましょう。
最初は`View Category`を作成してあげる必要があります。
「New View Category」に`SampleScene01`と入力して、「New View Name」に`View1`と入力、＋ボタンをクリックしましょう。

:::note info
カテゴリ・ビュー名についてはもちろん任意の名前を付けられます。運用次第でカテゴリを定義するとよさそうです。（自分はまだカテゴリ分けの最適解が見つけられていません...）
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/f789a542-b082-aaca-4c47-ba782796198a.png)

カテゴリとビュー名が登録されるので、同じように`View2`も追加しましょう。
今回はカテゴリは先ほど作成した`SampleScene01`を選択、ビュー名に`View2`と入力して＋ボタンを押せばOKです。
↓このように二つビュー名が登録されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/2b25d0de-bc3c-4115-55d7-476a6a483e96.png)

**ボタンの登録**
次にボタンをDBに登録します。
ビューと同様に、`Databases`→`Buttons`からカテゴリ名を指定して、ボタン名を二つ登録しましょう。
カテゴリ名は`SampleScene01`、ボタン名はそれぞれ`GoView1`、`GoView2`にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/a416cfd5-2e93-e4f3-ce0f-584b129043ff.png)


これでDBにビュー名を登録完了です。
ダッシュボードは閉じてしまってOKです。

### 画面遷移フローグラフの作成
次は、`何をしたら`、`どのビューが表示/非表示`をフローグラフに定義してきます。
プロジェクトビューから適当にフォルダを作って、右クリックメニュー`Create/Doozy/Flow Graph`からフローグラフファイルを作成します。
名前は適当に付けます。（今回はSampleScene01としました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/06af4c05-4daa-ecaf-b8ad-f5bb4f10a39a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/c70e76f1-8a2c-7dd7-d6db-89d72b84b2a2.png)
作成したフローグラフを編集していきましょう。
プロジェクトビューでフローグラフを選択した状態で、`Tools/Doozy/Nody/Window`からNodyウィンドウを開きます。

:::note info
後述のFlowControllerをヒエラルキーで選択した状態でも、フローグラフを編集可能です。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/1f16e955-8cc7-8969-e7a9-2169c3c2bdab.png)

Nodyウィンドウが開くと、Startノードだけが置いてある状態だと思います。
Nodyウィンドウでは、マウスホイール押し込みドラッグで移動すると便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/305ecee3-30e3-2adb-7720-2c9b53e764ab.png)

フローグラフで大事なノードは、記事の上の方で解説しているのでそちらを参考にしてください！

ではノードを追加・編集して画面遷移を作りましょう。
今回は、View1のボタンを押すとView2に遷移、View2のボタンを押すとView1に遷移、以降ループするような画面遷移を作ってみます。

NodyWindowの何もないところで右クリック、`Create Node`→`UI Manager/UI`からUIノードを追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/c476723f-a141-0cc8-b8d1-00c44f4e4931.png)

ノードが追加されたら、そのノードをクリックすることで選択、インスペクターで設定値を編集できます。
まずは、このノードに入ってきたときにView1を表示、出たときにView1を非表示にする設定にします。
手順は以下の通りです。
1. On Enter Nodeの「Show Views」の＋ボタンを押す
2. `Custom`がオンになっているので、オフにする
3. カテゴリーとビュー名が選べるので、それぞれ`SampleScene01`・`View1`を選択
4. 同じ手順でOn Exit Nodeの「Hide Views」に`View1`を登録する 

以下のようになっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/c2714c8a-c4b4-51b2-46a1-cdfe77f62786.png)

:::note warn
ShowとHideの違いに注意！
追加する場所を間違えないように注意してください！
:::

次は遷移について設定していきましょう。
同じノードの遷移条件の箇所(特にラベルはありませんね...。デフォルトで「TimeDelay」と設定されている箇所です)をクリック、`UIButton`を選びます。
そのあと、今回は`GoView2`ボタンを押したら画面遷移をしたいので以下のように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e3cd16fe-9be2-99ce-26c1-016be0df8084.png)

同じ要領で、`View2`の表示/非表示ノードを作成しましょう。
こんな感じで設定できていればOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/144e9ec5-0124-6bae-d242-c24f5fd39ca4.png)

最後に、各ノードをつなげて遷移順を定義しましょう。
各ノードの青い丸をドラッグ、黄色い丸まで引っ張ってドロップすると、ノードをつなげることができます。
ループさせるので、二つ目のUIの遷移先を一つ目のUIノードにつなぐのも忘れずに。
以下のように設定しましょう。（わかりづらくて申し訳ないです...）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/470b6197-1963-fcba-6875-c5ebc48e6681.png)

このように設定すると、以下のように処理が流れます。
1. ゲーム開始時にStartノードにつながれたノードに遷移する（View1を表示させるノード）
2. `GoView2`ボタンを押すと二つ目のUIノードに遷移する（View2を表示させるノード）
3. `GoView1`ボタンを押すと一つ目のUIノードに遷移する。
4. 以降ループ(2 ~ 4)

### DBに登録した識別子をコンポーネントに設定&もろもろ設定
もう少しでゴールですよ！
次はDBで設定したビューとボタンの識別子を各コンポーネントに設定して、フロー通りに挙動してくれるように設定していきます。

**ボタンの識別子設定**
先ほど追加した、View1の`UIButton`をヒエラルキーで選択、CategoryとNameをそれぞれ`SampleScene01`・`GoView2`に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/e2437bc6-df31-16cd-5057-b059c63f3085.png)

同じように、View2の`UIButton`にはCategoryを`SampleScene01`、Nameを`GoView1`に設定します。

**ビューの設定**
お次はビューです。
ビューはまだコンポーネントを追加していませんでしたね。
`View1`GameObjectに`UIView`コンポーネントを追加します。
(ヒエラルキー右クリックメニューからもUIViewつきGameObjectは追加可能)
`UIView`が追加出来たら、こちらもCategoryとNameを設定します。
それぞれ`SampleScene01`、`View1`に設定します。
こんな感じになっていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/72a787f1-8a62-6060-3269-1d5f80f699fd.png)

同じ要領で`View2`にも`UIView`を追加して、`SampleScene01`・`View2`をCategoryとNameに設定しましょう。

もう一つだけ設定します。
ビューはそのままでは、再生時に画面に表示されたままになってしまうので、初期状態を設定してあげる必要があります。
`View1`のUIViewのOnStartを`Instant Show`、`View2`のOnStartを`Instant Hide`に設定します。
View1は最初に表示、View2は最初は隠す、という設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/79d4e860-3ab3-57da-7cb4-9f82044648cf.png)


**FlowControllerの配置**
これで最後です！
先ほど作成したフローグラフをヒエラルキーに配置する必要があります。
ヒエラルキーで右クリック、`Nody/Flow Controller`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/c4a89945-a5a3-1ae8-d180-073a159e31a8.png)

次に、ヒエラルキーでFlow Controllerの`Flow Graph`に先ほど作成したフローグラフを設定します。
これでフローグラフが再生されるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/16fb8731-ca36-dfd8-a059-7ce4a238adda.png)

これで実行すれば画面遷移を確認できます！

:::note warn
喜び勇んで再生して以下のエラーが出た方は、EventSystemをヒエラルキーから選択、インスペクターの「Replace with InputSystemUIInputModule」ボタンを押せばOKです。
EventSystemが古いInputSystem用になっているので、変換が必要です。

InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.
:::

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62924/0f3999ba-ba0e-74b6-6cb8-c635afdb077e.gif)


簡単な画面遷移を作ってみる手順はこれにて終了です。
次のステップとして、前の節で便利なコンポーネントを紹介しているので、それらのコンポーネントを使ってビューやボタンをアニメーションさせてみるのもよいと思います！


# まとめ
ここまで読んでいただきありがとうございました。
Doozy UI Managerを使うにあたって必要な項目や便利機能の紹介、導入手順と実際に簡単な画面遷移を作成する方法を紹介しました！

トンデモボリュームになっちゃいましたが、自分がDoozyで使っている機能はあらかた紹介できたかなと思っています。
結構便利なアセットだと思っているんですが、いかんせん日本語の情報も少なくそこまで日本では普及していない印象です...
この記事で少しでもDoozyさんの便利さが伝わって、わかりやすいUI制御を組める人が増えればいいな～と思っております！