Last active
August 17, 2022 15:48
-
-
Save anzfactory/b789c319b24af0e88c85ff3725166bbd to your computer and use it in GitHub Desktop.
[Unity]ワールド座標をスクリーン座標へ変換するクラス拡張
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/********************************* | |
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