コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】ワールド座標を Screen Space - Overlay の Canvas 内のワールド座標に変換する関数

ソースコード

using UnityEngine;

public static class CameraUtils
{
    /// <summary>
    /// ワールド座標を Screen Space - Overlay の Canvas 内のワールド座標に変換します
    /// </summary>
    /// <param name="worldCamera">ワールド座標を描画するカメラ</param>
    /// <param name="worldPosition">変換前のワールド座標</param>
    /// <returns>変換後のワールド座標</returns>
    public static Vector3 WorldToScreenSpaceOverlay
    (
        Camera  worldCamera,
        Vector3 worldPosition
    )
    {
        return RectTransformUtility.WorldToScreenPoint
        (
            cam: worldCamera,
            worldPoint: worldPosition
        );
    }
}

使用例

using UnityEngine;

public class Example : MonoBehaviour
{
    public Transform     m_cube;
    public RectTransform m_text;

    private void Update()
    {
        m_text.position = CameraUtils.WorldToScreenSpaceOverlay
        (
            worldCamera: Camera.main,
            worldPosition: m_cube.position
        );
    }
}

f:id:baba_s:20191002152237g:plain

補足

f:id:baba_s:20191002152340p:plain

正しく使用できない場合は、Canvas の Render Mode が
「Screen Space - Overlay」になっているかどうか確認してみてください