夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityでカメラに対して常に見た目上の大きさが一定になるような実装

〇環境

・Windows11Pc

・Unity2022.3.26f1

〇カメラに対して常に見た目上のスケールが一定になる実装

今回はギズモのようにスクリーン上に常に一定の大きさで見える実装を行います。

Unityではシーンビューなどで選択しているオブジェクトのギズモを見ることができます。

これはオブジェクトのスケールに依存しておらず、遠くから見ても画面上に表示される矢印の大きさが変わらないようになっています。

今回はシーン上に矢印を配置し、ゲームビューで常に一定の大きさになるようにコードを書いていきます。

コードは次のようになります。次のコードを矢印の親オブジェクトにアタッチしました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public class GizumoManager : MonoBehaviour
    {
        // オブジェクトの初期スケール
        private Vector3 initialScale;

        // カメラからの初期距離
        private float initialDistance;

        // カメラへの参照
        private Camera mainCamera;

        // Start is called before the first frame update
        void Start()
        {
            mainCamera = Camera.main;

            // 初期スケールと初期距離を保存
            initialScale = transform.localScale;
            initialDistance = Vector3.Distance(transform.position, mainCamera.transform.position);
        }

        // Update is called once per frame
        void Update()
        {
            // カメラからの現在の距離を計算
            float currentDistance = Vector3.Distance(transform.position, mainCamera.transform.position);

            // 初期距離と現在の距離の比に基づいて新しいスケールを計算
            float scaleRatio = currentDistance / initialDistance;
            Vector3 newScale = initialScale * scaleRatio;

            // 新しいスケールを適用
            transform.localScale = newScale;
        }
    
}

ここでは起動時に初期スケールとカメラとの位置を取得(Start関数)

その後Update関数でカメラとの距離を再度計算、初期値のスケールと距離の比率に合わせてスケールを再計算し、新しいスケールをオブジェクトに適応しています。

これによって近くから見たときと遠くから見た時で矢印のオブジェクトの大きさが変化しないようになりました。

本日は以上です。