質問: (_sizeDelta.y / -2f) + (_sizeDelta.y) * _pivot.y; Debug.Log ("_sizeDelta.x:" + _sizeDelta.x); Debug.Log ("_sizeDelta.y:" + _sizeDelta.y); Debug.Log ("_sizeDelta.x / -2f:" + _sizeDelta.x / -2f); Debug.Log ("_sizeDelta.y / -2f:" + _sizeDelta.y / -2f); } } ``` ### 試したことと質問。 まず、sizeDeltaについて、下記のように認識しています。 ``` sizeDelta.x → CanvasのWidthの値。 sizeDelta.y → CanvasのHeightの値。 ``` 質問1:上記の認識は正しいですか? 認識している理由は、Debug.Logで出力をとったら、 それぞれCanvasのWidthとCanvasのHeightに一致する値が出力された為です。 また、Canvasの位置を変更しても、これらの値は変わりませんでした。 また、マニュアルの説明もあまり理解できませんでした。 アンカーの値を変えれば、sizeDeltaの値が変化するのかと思い、 Canvasのインスペクターで、[Rect Transform]の[Anchors]のMinのX, Y、MaxのX, Yの値を 変えたりしてみましたが、sizeDeltaの出力はCanvasのWidthとCanvasのHeightに一致するままで 変わりませんでした。 質問2: sizeDeltaは、Canvasの[Rect Transform]の[Anchors]の値によって変化しますか? 変化する場合は、どのような値を設定したときに変化しますか? 質問3: なぜ、「(_sizeDelta.x / -2f) はキャンバスの左端」で、 「(_sizeDelta.y / -2f」はキャンバスの下端」を表すのですか? キャンバスの左端とは、キャンバスの左端の座標のことですか?(下端についても同様の質問。) シーン上でCanvasの位置を変更して、ゲームを実行しても、 _sizeDelta.x / -2f や_sizeDelta.y / -2f の値は変わりませんでした。 質問1のように認識している為、_sizeDelta.x / -2fは、マイナスのCanvasのWidthの半分の値、 _sizeDelta.y / -2fは、マイナスのCanvasのHeightの半分の値に思えてしまいます。 ご教授のほどよろしくお願いします。
回答: 前回の説明についてですが、`Matrix4x4.MultiplyPoint`においての話です。 その値だけを見ても意味はありません。 カメラのビュー座標をワールド座標に変換した行列に、カメラ画面の中心をキャンバスのpivotを考慮した、キャンバスの起点を得る数式です。 1への回答 `RectTransform.sizeDelta`はキャンバスの`Width`と`Height`の値です。 2への回答 変わりません。 3への回答 上記に述べた通り、そこの値だけを取り出しても意味はなく、上記のケースにおいてにしかその意味を持ちません。 あくまで、キャンバスをカメラ画面の中心に持ってくるときに、移動前のキャンバスの座標とは関係なく、カメラから見たキャンバスの起点になるローカル座標が必要なので、その起点の座標を得るのに`sizeDelta`の値と`pivot`の値を利用しているだけです。 例として、`sizeDelta(2,4)`のキャンバスをカメラの中心に移動する場合、 カメラから見た画面の中心が(0,0)で、そこの中心にキャンバスを移動するためには、 移動先のキャンバスの左下の座標が必要になります。 このとき、キャンバスの左端となる座標を求めるには画面の中心(0)からキャンバスの幅の半分`(sizeDelta.x / 2f)`から引くと求めることができます。 `0 - (sizeDelta.x / 2f)` → `(sizeDelta.x / -2f)`となります。 `pivot`の値を考慮する必要があるので、キャンバスの幅に`pivot`を掛けます。 `(sizeDelta.x) * pivot.x` この2つを足すことで座標を求めます。 `(sizeDelta.x / -2f) + (sizeDelta.x) * pivot.x;` y座標も同様です。 `sizeDelta`の値が変わっていないのは、キャンバス自体のサイズは移動前も後も変わっていないからです。