【Unity】モバイルアプリで全画面対応する (改訂版)

# はじめに
### 改訂版について
↓2年前くらいに書いた記事が汚いので、改訂版として作成します。

https://qiita.com/kiku09020/items/7c4a66d6c8ea7c500a09




# 複数機種対応について
モバイルデバイスの場合、PCデバイスとは異なり、複数の機種に対応する必要があります。

### ノッチ
最近のデバイスは、画面上部などに「ノッチ」なるものが存在します


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/0f637306-db03-c822-e8a8-12b1856ed3f5.png)

> 引用: [スマホのノッチとは？ベゼルやパンチホールとの違いや、ノッチのデザインについて解説(楽天モバイル)](https://network.mobile.rakuten.co.jp/sumakatsu/contents/articles/2024/00129/)

ノッチなどを考慮せずにそのまま表示するとこんな感じになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/f28a63f9-b848-01a8-af1a-f2fa6727a566.png)

この問題を解決するために、DeviceSimulatorを利用します。





# 結果
![SafeArea (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/2a0836e3-b51c-fa9e-4e59-dbc288a473eb.gif)

- スコアのテキストがノッチに被せず、自動で位置調整されます

# 準備
- DeviceSimulatorをPackageManagerからインストールします

https://docs.unity3d.com/ja/2022.3/Manual/device-simulator.html





# UIの調整
### 説明
- **`SafeArea / Screen.currentResolution` で、目的のアンカーサイズを求められます**
- `[ExecuteAlways]`属性で、Editor上での操作時にもサイズを更新します
- デバイス変更時、コンポーネントのenable変更時に更新されます

### コード
https://gist.github.com/kiku09020/2f11debb86c6b4fbb6958ef1edcb3c2a



### ヒエラルキーなど
- **Canvasコンポーネントが追加されているオブジェクトではなく、その子オブジェクトに Add Componentします**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/bd54d3a7-eb78-b3d7-9fdd-454f7e953c0c.png)

- 子オブジェクトのRectTransform / Anchors / Min, Max の値が変更されていたら成功です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/cb3cbe58-a3ef-4760-8837-621d063ecadd.png)

# スプライトの表示
以下に対応策などを軽く紹介します


### カメラサイズの調整
通常のゲーム画面がこんな感じだとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/ae9b8c0c-fbbb-f7f7-000f-06f0d37ab6a9.png)


これを、「Samsung Galaxy Z Fold2 5G」というデバイスで表示すると、こんな感じになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/10a5b5bc-f4e3-752e-9a90-6fbb116789e1.png)

**縦長すぎて収まりません。**

これを、カメラのOrthographicSizeを調整すると、こんな感じになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/b4cad0cb-9c10-97c1-62ec-95b82827b9c7.png)

**縦持ちの場合、横幅が完全に表示されるOrthographicSizeに調整します。**

このように、2Dの場合はカメラのOrthographicSizeを調整する形で対応するのが無難かと思います。

が、上図のように、床のスプライトが想定より上に表示されたりするので、このあたりの細かい調整はプロジェクトごとに対応する必要があります。
(この場合、SpriteのTileSizeのHeightを調整して対応すれば解決できます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/60459c72-41b0-da13-c295-507240e79ac1.png)

##### コード
https://gist.github.com/kiku09020/d11fbb7bbf64b368db24a6425b0c44b3

##### 使い方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/e3fedc46-acc8-7c0e-c3ce-1667674de493.png)

- CameraコンポーネントがアタッチされているオブジェクトにAddComponentします
- Reference Resolution、Reference Camera Sizeにゲームビューで正常に表示されている際の解像度、OrthographicSizeを設定します
- 適当なデバイスに変更してみて、OrthographicSizeが自動で変更されていたら成功です



### スプライトなどの領域を余裕を持って表示させる
- ゲームビューでは問題なく表示されていますが…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/add8dba7-a2ab-67b0-4784-ac53903dc879.png)

- タブレット端末などは、こんな感じになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/fe8d99e0-35d4-4009-e425-d86cdb6de830.png)

床のスプライトが途中で途切れてしまいます。
床などの単純なスプライトの場合、DrawModeをTiledにして、Sizeを調整すれば解決できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/05b311d0-f578-cc33-a468-9b6cff3447c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/0471bbe8-f9cd-e586-833a-4566459c3f9b.png)



ちゃんとした感じのスプライトの場合、タブレット端末を基準としてスプライトを調整する必要があるかもです。(表示するものによりますが…。)


### 最下レイヤーにCameraのCanvasでRepeatのTextureをセットしたImageをセット
床スプライトと同様に、Tiledでパターン的な背景を表示させる場合は、この方法で対応できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/5df50e6c-5d35-251b-2120-16440c28d2b7.png)

なんかすごい絵面。

- CanvasでScreenSpace-Cameraに設定、Sortingを一番下に設定
- ImageのImage TypeをTiledに設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/e4e3b0e1-e77a-eed5-72c6-bc2af49f5cc1.png)

### 黒い帯を挿入する
正直、今の時代に合わない対応ですが、画面外に黒い帯などを挿入して対応することも可能です

下記のサイトなどをご参考ください

https://feynman.co.jp/unityforest/game-create-lesson/clicker-game/mobile-adjustment/


# さいごに
UIの対応は、ご紹介した方法で対応可能ですが、
スプライトの表示などはプロジェクトごとに異なり、絶対的な対応策などはないのが難点です…
また、3Dゲームの場合も対応が分かれるので、難しいですね…