メインコンテンツまでスキップ

UI_2_画面外インジケーター_詳細

この部分は、UI要素(インジケータ)が画面内でどれくらい大きな比率で外側に近づいているかを計算する処理です。


  1. canvasScale

    • UI要素のスケールを計算するために必要な値です。
    • キャンバス全体のスケール値で、UI座標とスクリーン座標の換算に利用されます。
  2. rectTransform.sizeDelta

    • UI要素(インジケータ)の幅と高さを表します(ローカル座標系でのサイズ)。
  3. center

    • スクリーンの中心座標(Screen.width / 2, Screen.height / 2)をベースにした値です。
  4. Mathf.Max

    • 引数の中で最も大きい値を返します。この場合、画面の幅方向か高さ方向で、インジケータがどれくらい外側にあるかを計算しています。

コードの説明

1. halfSize の計算

var halfSize = 0.5f * canvasScale * rectTransform.sizeDelta;
  • rectTransform.sizeDelta は UI要素のサイズ(幅と高さ)をピクセル単位で表した Vector2
  • canvasScale を掛けることで、現在のスケールに基づいたサイズに変換します。
  • 最後に 0.5f を掛けることで、UI要素の幅と高さの 半分のサイズ を計算しています。
    • これは UI要素の中心から端までの距離 を求めるためです。

2. d の計算

float d = Mathf.Max(
Mathf.Abs(pos.x / (center.x - halfSize.x)),
Mathf.Abs(pos.y / (center.y - halfSize.y))
);
  • これは、インジケータの現在位置が画面の端にどれくらい近いかを計算する処理です。
(a) Mathf.Abs(pos.x / (center.x - halfSize.x))
  • pos.x は、スクリーン中心を基準としたインジケータの横方向の位置。
  • (center.x - halfSize.x) は、インジケータが画面内に完全に収まるための横方向の最大距離(中央から右端までの距離からインジケータの半分の幅を引いたもの)。
  • この比率を計算することで、「インジケータが横方向で画面端にどれくらい近いか」がわかります。
(b) Mathf.Abs(pos.y / (center.y - halfSize.y))
  • 縦方向について同様の計算を行います。
  • pos.y はスクリーン中心を基準としたインジケータの縦方向の位置。
  • (center.y - halfSize.y) は縦方向でインジケータが完全に収まるための最大距離。
(c) Mathf.Max(...)
  • 横方向と縦方向のどちらか 最も大きい比率(インジケータが外側に寄っている方向)d に代入します。
    • これは、画面の端に近い方向を優先的に評価するためです。

目的

この計算の目的は、インジケータが 画面外に出るかどうか を判断し、場合によっては位置を調整するためです。


ポイント

  • d1 を超えると、インジケータが画面内に収まらず、画面外に出た可能性があることを示します。
  • d <= 1 の場合、インジケータはまだ画面内に収まっています。

次の処理に関係

以下のコードで、インジケータが画面外に出た場合の位置調整をしています:

if (isOffscreen) {
pos.x /= d;
pos.y /= d;
}
  • pos.xpos.yd で割ることで、インジケータを画面内に収めています。