質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.94%

キャンバスの左端とsizeDelta

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,514

score 342

前提・実現したいこと

前回の質問でご教授いただいた内容で、
回答者様から「(_sizeDelta.x / -2f) はキャンバスの左端」で、
「(_sizeDelta.y / -2f」はキャンバスの下端」であるとご教授いただきました。

これらが何故、キャンバスの左端や下端を表すのか理解できていません。
ご教授のほどよろしくお願いします。

※キャンバスはWorld Spaceで扱います。

該当のソースコード

今回の質問部分を下記のコードに抜粋しました。

public class CanvasScript : MonoBehaviour {
    public Canvas canvas;

    // Use this for initialization
    void Start () {
        var _canvasRectTf = canvas.GetComponent<RectTransform>();
        var _pivot = _canvasRectTf.pivot;
        var _sizeDelta = _canvasRectTf.sizeDelta;
        var _pos = Vector3.zero;
        _pos.x = (_sizeDelta.x / -2f) + (_sizeDelta.x) * _pivot.x;
        _pos.y = (_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の値。


質問①:上記の認識は正しいですか?

認識している理由は、Debug.Logで出力をとったら、
それぞれCanvasのWidthとCanvasのHeightに一致する値が出力された為です。
また、Canvasの位置を変更しても、これらの値は変わりませんでした。

また、マニュアルの説明もあまり理解できませんでした。
アンカーの値を変えれば、sizeDeltaの値が変化するのかと思い、
Canvasのインスペクターで、[Rect Transform]の[Anchors]のMinのX, Y、MaxのX, Yの値を
変えたりしてみましたが、sizeDeltaの出力はCanvasのWidthとCanvasのHeightに一致するままで
変わりませんでした。

質問②:
sizeDeltaは、Canvasの[Rect Transform]の[Anchors]の値によって変化しますか?
変化する場合は、どのような値を設定したときに変化しますか?

質問③:
なぜ、「(_sizeDelta.x / -2f) はキャンバスの左端」で、
「(_sizeDelta.y / -2f」はキャンバスの下端」を表すのですか?
キャンバスの左端とは、キャンバスの左端の座標のことですか?(下端についても同様の質問。)
シーン上でCanvasの位置を変更して、ゲームを実行しても、
_sizeDelta.x / -2f や_sizeDelta.y / -2f の値は変わりませんでした。
質問①のように認識している為、_sizeDelta.x / -2fは、マイナスのCanvasのWidthの半分の値、
_sizeDelta.y / -2fは、マイナスのCanvasのHeightの半分の値に思えてしまいます。

ご教授のほどよろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

前回の説明についてですが、Matrix4x4.MultiplyPointにおいての話です。
その値だけを見ても意味はありません。
カメラのビュー座標をワールド座標に変換した行列に、カメラ画面の中心をキャンバスのpivotを考慮した、キャンバスの起点を得る数式です。

1への回答
RectTransform.sizeDeltaはキャンバスのWidthHeightの値です。

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の値が変わっていないのは、キャンバス自体のサイズは移動前も後も変わっていないからです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/01 23:05 編集

    すみません、これが本当に最後の質問にしたいと思います。
    例の式(_pos)の作り方は、「カメラから見た移動先のキャンバスのpivotを考慮した起点の座標(ローカル座標)」という考え方で合っていますか?

    キャンセル

  • 2016/11/01 23:33

    その考え方で問題ありません。

    キャンセル

  • 2016/11/02 00:06

    ご回答ありがとうございます。
    私の理解力が無い為、何度も質問してすみませんでした。
    ずっとイメージがわからず悩んでたので、とても勉強になりました。
    最後までご丁寧にご教授いただきありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る