Unity(for iOS app)で画面の回転対応をするログ
SafeAreaとデバイスのスクリーンの差は、iPhone Xs時代では、
Portrait: 上44pt, 下33pt(SafeAreaではないが、横にはマージン16pt/20pt)
Right/Left: 上なし、下21pt、左44pt + マージン20pt、右44pt + マージン20pt
UnityEngineがScreen.safeArea
で返してくる値
(※iPhone 12 Pro)
Portrait
(x:0.00, y:102.00, width:1170.00, height:2289.00)
LandscapeRight
(x:141.00, y:63.00, width:2250.00, height:1107.00)
あれなんかおかしい?
↑これによると、iPone 12 ProのSafeAreaは
Portrait: 上47 pt, 下34pt
Right/Left: 上なし、下21pt、左47pt + マージン20pt、右47pt + マージン20pt
で、端末サイズは390x844 pt (1170x2532 px @3x)。
横に関しては計算が合うけど、縦がなんか……?
ああ、おかしくないか。
左下が原点なのね。
こういうことだ。
アンカーとpivotがよくわかってないので、これ↓を読む
完全に理解した
-
RectTransform
は親Objectとの相対座標を定義するもの - アンカーによって、親Objectのどの座標を基準にするかを決める
- pivotは自分のどの座標を基準にするかを決める
- アンカーのmin/maxという概念がわかりづらい
これ便利だ
アンカーのmin/maxという概念がわかりづらい
X座標の操作は直感的なんだけど、Y座標がよくわからない動きしていた。
原因がわかった。
アンカーは、左下を(0, 0)、右上を(1, 1)として指定する。
たとえばminXとmaxXを0, minYとmaxYを1にすると、座標(0, 1)がアンカーになる。
単にアンカーの座標を指定するだけなら、min/maxの概念は不要なのだが、
なぜmin/maxがあるかというと、ストレッチという操作ができるからだ。
minX=0, maxX=1にすると、X方向に最大限オブジェクトを伸ばすことができる。
X方向のストレッチは直感的だ。
0 - 0.5にすれば左半分、0.5 - 1にすれば右半分になる。
Y方向はちょっと直感に反する。
0 - 0.5だと下半分、0.5 - 1だと上半分となる。
直感に反する、と感じるのはそもそも僕が左上を原点として考えがちなせいかもしれない。
iOSアプリだと左上が原点で、そっちに慣れてしまった。
むしろUnityの方が普通の二次間数の感覚としては自然だろう。
アスペクト比が気になった。
Canvas Scalerのデフォルトは800 * 600(4:3)だけど、iPhoneは16:9の端末が多いので、それに近い方がいいかなと思った。
↑これを読んでたら、4:3で良いかと思ってきた
よく確認したら、最新のiPhoneは9 : 19.5になっている
結局、Canvas Scalerを持ったGameObjectの下に空のGameObjectをつくった。
↓設定はこんな感じ
この下にUI部品を入れていって、回転のときにもいい感じになるように調整した。
当初UI部品を一箇所に集約しようと思っていたが、いざやろうとすると、設計的に厳しくなる処理があったので、
汎用的に使えるスクリプトを一個用意して、Canvas持ってるGameObjectにComponentとしてつける方針でいった