Skip to content

Instantly share code, notes, and snippets.

@anzfactory
Last active August 17, 2022 15:48
Show Gist options
  • Save anzfactory/b789c319b24af0e88c85ff3725166bbd to your computer and use it in GitHub Desktop.
Save anzfactory/b789c319b24af0e88c85ff3725166bbd to your computer and use it in GitHub Desktop.
[Unity]ワールド座標をスクリーン座標へ変換するクラス拡張
/*********************************
2015-06-20
Vector3拡張
座標変換参考:http://tsubakit1.hateblo.jp/entry/2016/03/01/020510
*********************************/
using UnityEngine;
using UnityEngine.Assertions;
public static class Vector3Extension
{
/// <summary>
/// CanvasのRender Mode が Scene Space - Overlay の場合に、ワールド座標をスクリーン座標に変換する
/// </summary>
/// <returns>変換されたスクリーン座標</returns>
/// <param name="position">対象のワールド座標</param>
public static Vector2 ToScreenPositionCaseScreenSpaceOverlay(this Vector3 position)
{
return position.ToScreenPositionCaseScreenSpaceOverlay(Camera.main);
}
/// <summary>
/// CanvasのRender Mode が Scene Space - Overlay の場合に、ワールド座標をスクリーン座標に変換する
/// </summary>
/// <returns>変換されたスクリーン座標</returns>
/// <param name="position">対象のワールド座標</param>
/// <param name="camera">メインカメラ</param>
public static Vector2 ToScreenPositionCaseScreenSpaceOverlay(this Vector3 position, Camera camera)
{
return RectTransformUtility.WorldToScreenPoint(camera, position);
}
/// <summary>
/// CanvasのRender Mode が Scene Space - Camera の場合に、ワールド座標をスクリーン座標に変換する
/// </summary>
/// <returns>変換されたスクリーン座標</returns>
/// <param name="position">対象のワールド座標</param>
/// <param name="canvas">UIのCanvas</param>
public static Vector2 ToScreenPositionCaseScreenSpaceCamera(this Vector3 position, Canvas canvas)
{
return position.ToScreenPositionCaseScreenSpaceCamera(canvas, Camera.main);
}
/// <summary>
/// CanvasのRender Mode が Scene Space - Camera の場合に、ワールド座標をスクリーン座標に変換する
/// </summary>
/// <returns>変換されたスクリーン座標</returns>
/// <param name="position">対象のワールド座標</param>
/// <param name="canvas">UIのCanvas</param>
/// <param name="uiCamera">UIを写すカメラ(CanvasのRenderCameraに設定されているカメラ)</param>
public static Vector2 ToScreenPositionCaseScreenSpaceCamera(this Vector3 position, Canvas canvas, Camera uiCamera)
{
return position.ToScreenPositionCaseScreenSpaceCamera(canvas, uiCamera, Camera.main);
}
/// <summary>
/// CanvasのRender Mode が Scene Space - Camera の場合に、ワールド座標をスクリーン座標に変換する
/// </summary>
/// <returns>変換されたスクリーン座標</returns>
/// <param name="position">対象のワールド座標</param>
/// <param name="canvas">UIのCanvas</param>
/// <param name="uiCamera">UIを写すカメラ(CanvasのRenderCameraに設定されているカメラ)</param>
/// <param name="worldCamera">メインカメラ</param>
public static Vector2 ToScreenPositionCaseScreenSpaceCamera(this Vector3 position, Canvas canvas, Camera uiCamera, Camera worldCamera)
{
Assert.IsTrue(
canvas.renderMode == RenderMode.ScreenSpaceCamera,
"Canvasのレンダーモードが「Scene Space - Camera」になっていません"
);
var p = RectTransformUtility.WorldToScreenPoint(worldCamera, position);
var retPosition = Vector2.zero;
RectTransformUtility.ScreenPointToLocalPointInRectangle(
canvas.GetComponent<RectTransform>(),
p,
uiCamera,
out retPosition
);
return retPosition;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment