デザイナーのためのUnity uGUI

#はじめに
この記事の目的は、デザイナーがUnity上でUIのレスポンシブ対応、UIアニメーション、画面遷移を作り上げることです。
コードを一切書かずに、デザイナーが意図している挙動をUnity上で実現し、エンジニアに渡すことがゴールです。

ここまでデザイナーがやれば、エンジニアが死ぬほど助かると思います。
そして、ここまでできるデザイナーは重宝されるでしょう。


## ※必須の設定
Canvasを作ることから始めます
####Canvas Scaler

- 「UI Scale Mode」を「Scale with Screen Size」にする
- Reference Resolution」のX, Yのサイズをレスポンシブの最大値に設定

（2020.4 現在で、一番横幅が大きいXperia 1644に設定している）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/02897053-31cd-e68f-6e0d-2a92f9bd95ba.png)

####Rect Transformの理解
このへんを参考にしてください
[【Unity uGUI】RectTransformの基本的な使い方を理解する](https://xr-hub.com/archives/11543)
[【Unity uGUI】Rect Transformコンポーネントを徹底解説](https://tech.pjin.jp/blog/2017/03/22/unity_ugui_rect-transform/)

最初は戸惑うと思いますが、たくさん触っているとだんだん体で慣れてきます。


##UIの追加
####Image
- Source Imageに適した画像を貼り付ける
- Set Native Sizeで作った解像度で設置される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/28352fb7-0ad5-ae43-41aa-f86a42a05496.png)

####Button
- Imageは同様に貼り付け、サイズを変更
- 子にあるTextは使わなければ消す
- Button Componentでアクション時の動作を設定
    - よく使うのはTransitionの「Sprite Swap」
    - Pressed Sprite等に押された挙動の画像を貼る
   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/a1c0f9ae-27de-9336-e0e0-3416050fe819.png)

※ボタンによる画面遷移は後述

####その他
- Slider
- Scroll Bar
- Scroll View 

などは必要な時に、調べましょう。
公式のチュートリアルが参考になります。

公式
(https://learn.unity.com/tutorial/ui-components)

Scroll Viewのわかりやすい記事
[[Unity uGUI] スクロールビューの基本と軽量なスクロールリストビューの作り方  - Qiita](https://qiita.com/k7a/items/7db3a41e39923fd8a3b3)

##ヒエラルキー構造

私が使っている構造。
UIアニメーションを使い回しすることを前提に、こう組んでいます。
Animator Componentをつけているオブジェクトのオンオフせずに、中身をオンオフするためにContentsを挟んでいます。
（Animator Componentが動いている状態でオンオフするのは意図しない挙動をする可能性があるらしい。）


例

- Canvas
    - ModalThisGameFree（空オブジェクト。命名はわかりやすいようにする）
        - ModalContents（空オブジェクト。アニメーションを使い回せるように、名前を統一する）
            - Bg
            - Button
            - などなど中身

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/b298c3ce-888b-6abb-7b02-e928e84e0e1a.png)


##### ModalThisGameFree
- Canvas Group Component
- Animator Component

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/f5acb33d-5006-8e2c-3a91-d2629316165e.png)

#### Contents
- 特にComponentをつけない
- Animationで、このオブジェクトの is Active を変更することでオンオフを切り替える

##UI アニメーション
####基本的にアニメーションが関連するComponent

- Rect Transform
    - Position
    - Rotation
    - Scale
- Canvas Group
    - Alphaでそのオブジェクト配下の透明度を一括で変えることができる

###アニメーションの作り方
1. 動かしたいオブジェクトにAnimator Componentを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/09e0e2e7-dc72-3ee8-bbfa-b41a0bfb25f3.png)

2. Animation Controllerを作成、Animator Componentの Controllerに貼り付ける
まだ何もない状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/a0bdd0bf-41e0-e2a0-95dd-37039c82923e.png)

3. Animation ウィンドウのCreateから Animation（.anim）を作成、アニメーションを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/731c5be9-25ff-3bdd-151a-eb53681ebdce.png)

使いまわせるアニメーションにするには、
「Animator Componentがついているオブジェクト」か「名前が同じである子オブジェクト」の操作のみにする。
（そのためのヒエラルキー構造。）

こうしないと、別オブジェクトに同アニメーションをつけた場合に、Missing状態になる。
（Unityアニメーションは子の名前から参照しているため）

※色々構造とかややこしくしているのは、アニメーションの使い回しを前提としているためです。
もしアニメーションがほとんど異なるものを使うなら、気にしなくていいところ。

##画面遷移

UIアニメーションともう少しのことを理解すれば、デザイナーでもUnity Editor上で画面遷移を作ることができます。

「ModalThisGameFreeのOKボタンを押すと、Tutorialの画面に進む」という例で説明します。

1. ModalThisGameFreeが閉じるアニメーションを作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/abe05a70-05f5-f079-2624-c87768c921a3.png)
例のように、この画面を閉じるのなら、ModalContentsの Is Activeをオフにする

2. Animatorウィンドウで、閉じる遷移を作る
    Any StateからFadeoutにTransitionをつなげる

3. ParametersでTriggerを作る（FadeoutClose）
![Screen Shot 2020-04-29 at 15.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/e0003203-607a-948f-6f79-504992bb7449.png)


4. TransitionのConditionに先ほどのTrigger(FadeoutClose)を設定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/e178511c-55d7-be2b-bac2-eb9504889d4a.png)


5. OK ButtonのButton Componentの On Click設定をする
   対象のアニメーションさせるオブジェクトをドラッグドロップで持ってくる
![Artboard1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/23f63c88-1449-13c5-2a7d-1cb6663cac25.png)
Functionを「Set Trigger(string)」にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/73ac74a2-6010-3df8-60c6-bf73c61f1380.png)
stringの部分にTriggerの名前(FadeoutClose)をいれる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/37bca062-ca0f-e64d-a7fb-1ff1cdcee068.png)

6. ここまでで、「OK Buttonを押すと、ModalThisGameFreeが閉じるアニメーションが再生され、中身も非アクティブになる」と言う状態が完成されます。

7. あとはTutorialに同様の操作をします

- Modal TutorialにAnimator Componentをつける
- アニメーションの作成
- Triggerを作成、Conditionに設定
- ButtonのOn Clickで Triggerをセット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/c88beaa8-8c45-6cfe-8616-545096d98a67.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293594/92ba7532-bc3c-2964-1bac-1e81c3040e94.png)


これで、「ModalThisGameFreeのOKボタンを押すと、Tutorialの画面に進む」という、一つの画面遷移が完成です！
ここまで見ると、長く大変そうに感じますが、繰り返しの作業はシンプルなので、慣れるときっとすぐです。



##最後に
ここまでシーンを作ってエンジニアに渡せば、エンジニアの負担がめちゃくちゃ下がると言ってました。
こだわりを持って配置やアニメーションをさせたいデザイナーや、エンジニアが少ないチームのデザイナーはぜひ参考にしてください！