Closed10

Unity(for iOS app)で画面の回転対応をするログ

SafeAreaとデバイスのスクリーンの差は、iPhone Xs時代では、

Portrait: 上44pt, 下33pt(SafeAreaではないが、横にはマージン16pt/20pt)
Right/Left: 上なし、下21pt、左44pt + マージン20pt、右44pt + マージン20pt

https://qiita.com/usagimaru/items/761e9a5f3d78b1939df8

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)

あれなんかおかしい?

https://qiita.com/MJeeeey/items/a640922da33dacc0fc30

↑これによると、iPone 12 ProのSafeAreaは

Portrait: 上47 pt, 下34pt
Right/Left: 上なし、下21pt、左47pt + マージン20pt、右47pt + マージン20pt

で、端末サイズは390x844 pt (1170x2532 px @3x)。
横に関しては計算が合うけど、縦がなんか……?

ああ、おかしくないか。
左下が原点なのね。

こういうことだ。

完全に理解した

  • 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の方が普通の二次間数の感覚としては自然だろう。

https://qiita.com/st43/items/3802624d15a8dded8169

結局、Canvas Scalerを持ったGameObjectの下に空のGameObjectをつくった。
↓設定はこんな感じ

この下にUI部品を入れていって、回転のときにもいい感じになるように調整した。
当初UI部品を一箇所に集約しようと思っていたが、いざやろうとすると、設計的に厳しくなる処理があったので、
汎用的に使えるスクリプトを一個用意して、Canvas持ってるGameObjectにComponentとしてつける方針でいった

このスクラップは2021/03/18にクローズされました
ログインするとコメントできます