iPhone X で uGUI がはみ出さない簡単な方法

[ヴァル研究所 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/val)の16日目はUnityに関する記事です。

# はじめに

この記事ではiPhone Xの **セーフエリア** とかどうでもいいからとにかく簡単にuGUIを表示させる目的で対処しています。
また、利用したUnityは **2017.1.2f1** です。
最新のUnityではこんな対処いらないかもしれません。

# iPhone Xの違いって何？

特に大きな違いは画面ですよね。
**iPhone 8** であれば *1334×750px* の **16:9**、 **iPhone 8 Plus** も *1920×1080px* なので、 **16:9** です。
また、少し前の **iPhone 4S** だと **3:2** ですが、 **16:9** 前提で開発している人も少なくないと思います。

しかし、 **iPhone X** は衝撃の *2436x1125px* で **19.5:9** となります。
iPadも **4:3** だし、今までになかったアスペクト比です。

もう、画面の端が丸いとか、それ以前に困ったことが起こります。

# uGUIがはみ出ちゃう

こんな感じでピッタリに配置していることってよくありますよね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/e2dc2083-ee5b-ac61-4479-a9f0a0281017.png)

この仕組は簡単で、 **UI Scale Mode** を *Scale With Screen Size* にして16:9となる解像度を **Reference Resolution** に設定すればピッタリ合います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/df6f8649-abe8-4912-ed98-cbcf6891965e.png)

・・・そう、iPhone 8までは。

このままiPhone Xで動かすと、当然上下がはみ出します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/f31b5a1d-7988-4f3c-5d49-6d0ae7000eda.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/ad6e0290-3225-daf0-0dee-c638e5b296b6.png)

まあ、これは **Screen Match Mode** を *Expand* にするだけでアスペクト比を固定したまま表示になるので、簡単にUIが表示されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/97598c4d-e61f-78d0-1ad0-e60687ce1fa2.png)

でも、左右に何か青いものが！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/04df3bf3-c969-9463-3b73-d4fbbac81031.png)

しかも、本来画面外に出るはずのテキストも表示されるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/a8ea5127-89a2-6bb3-34f4-c00df4e0372e.png)

# uGUIではみ出た部分をマスクする

やはりはみ出した部分はカットしたいですよね。
これも簡単です。
こういうときには **Rect Mask 2D** がとても便利です。

## ※よくあるミス

Canvasに **Rect Mask 2D** を追加しても何も変わりません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/dc7c3d8f-5827-0fda-afed-554abf6c9275.png)

## 回避方法

Canvasの下に空のゲームオブジェクトを作成してそこに **Rect Mask 2D** を追加します。
ついでにCanvas直下の要素をすべてRect Mask 2Dの子要素に移動させます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/42a9f827-2b35-e6c1-3937-56eb0b444464.png)

また、**Width** と **Height** にCanvasの *Scale With Screen Size* で指定した値を入れておきます。
PosやScaleなど、その他は全てデフォルト設定でOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/b850c0fd-6694-1458-2e01-a9366bbfea15.png)

これで、ちゃんと隠れるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/97f61297-c9c6-188a-556e-1c690c6a35b2.png)

## 左右の青い部分

あとは、左右の青色ですが、これはMain Cameraの **Background** ですので、普通に *#00000000* を指定すれば黒くなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/19913e04-b388-9acf-ced2-359f7384b38e.png)

# 出来上がった画面

こんな感じではみ出すこともなく、画面に収まりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/da7b93ea-f358-e211-255a-c84d4d36ecd2.png)

ついでにiPhone Xの画面設定も追加しておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153241/9a9656d4-40a3-6788-e8bd-14d45b6a8874.png)

# まとめ

これで、

*エライ人* **「iPhone Xで動くの？」**
*開発者* **「えっ、まだiPhone X手に入れてないんですけど」**
*エライ人* **「いや、あの角丸とか対応しなくていいから。とりあえず枠アリでいいから」**
*開発者* **「あー、それなら、既存のアプリは枠アリで表示されるという噂ですから大丈夫ですよ」**
*エライ人* **「じゃあ、やってみよう。ここにiPhone Xあるから」**
*開発者* **「Xcode 9でビルドして転送」**
→<font color="Crimson">**事故る**</font>

ってことがなくなります。