RectTransformUtilityとは?

Unityにおいて、Canvas以下にあるGameObjectはTransformの代わりに

UI要素の位置やサイズ調整を行う際に使用する、RectTransformコンポーネントを持っています。

RectTransformUtilityはRectTransformに関する便利な機能を提供するクラスです。

スクリーン座標をローカル座標に変換する

ScreenPointToLocalPointInRectangleメソッドを使用します。

以下の例の場合、マウス座標を、第1引数に渡したRectTransform上のローカル座標に変換し、

localPointとして返します。

private void Update()
{
	Vector2 localPoint;
	RectTransformUtility.ScreenPointToLocalPointInRectangle(
	    rectTransform, 
	    Input.mousePosition, 
	    Camera.main, 
	    out localPoint
	);
}

ワールド座標をスクリーン座標に変換する

WorldToScreenPointメソッドを使用します。

Vector3 screenPoint = RectTransformUtility.WorldToScreenPoint(Camera.main, worldPosition);

スクリーン座標が矩形の範囲内にあるかどうか

RectangleContainsScreenPointメソッドを使用します。

以下の例の場合、マウス座標が第1引数のRectTransformの範囲内にあるかどうかを判定します。

画像をドラッグできるかどうか判定する場合に使えそうです。

private void Update()
{
	bool isInside = RectTransformUtility.RectangleContainsScreenPoint(
	    rectTransform, 
	    Input.mousePosition, 
	    Camera.main
	);
}

軸に沿って反転させる

FlipLayoutOnAxisメソッドを使用します。

指定した軸にそってレイアウトを反転させます。

RectTransformUtility.FlipLayoutOnAxis(rectTransform, 0, false, false);

第二引数が

  • 0なら水平方向
  • 1なら垂直方向

に反転させます。

ピクセルを正しいポイントに変換する

UIのピクセルパーフェクトな描画のため、

PixelAdjustPointやPixelAdjustRectを使用して、微妙な位置やサイズの調整を行うことが出来ます。

Vector2 adjustedPoint = RectTransformUtility.PixelAdjustPoint(originalPoint, rectTransform, canvas);

各メソッドに渡すカメラについて

例の中でCamera.main を渡している箇所がありますが、

実際にはRectTransformが属するCanvasが使用しているカメラを渡してください。

CanvasのRenderModeが、

WorldSpaceの場合はEventCamera,

ScreenSpace-Cameraの場合はRenderCamera

に指定されているカメラを渡します。

ScreenSpace-Overlayの場合カメラを指定していないので、各メソッドにはnullを渡します。

private void Update()
{
	bool isInside = RectTransformUtility.RectangleContainsScreenPoint(
	    rectTransform, 
	    Input.mousePosition, 
	    null
	);
}

まとめ

RectTransformUtilityは、UIの座標変換やレイアウトの調整やヒットテストなど、

RectTransformを扱う際に非常に役立つ機能を提供します。

これらを使うことで、UI操作を便利に行うことが出来ます。

自前でスクリプトを書こうと思うとなかなか大変ですが、公式でユーティリティが用意されているので、

積極的に活用しましょう。

📣おしらせ!

Unity Asset Storeで

世界を揺るがすフラッシュセール

が開催中です。

最高のワールド制作に必要なすべてが、24時間限定で70% OFF!

フラッシュセール

50%オフ