Web Analytics

こつこつエンジニア

現役アプリ開発者によるIT系特化ブログ

Unityでカメラの範囲内にオブジェクトが写っている時のみオブジェクト情報を表示する【オブジェクト表示3】

f:id:madai21:20210720210353j:plain

はじめに

Unityのオブジェクト表示最終回です。
前回はカメラがどの距離でもオブジェクト上に一定サイズのテキストを表示させてみました。
madai21.hatenablog.com

カメラ範囲外でも情報を表示してしまっているという課題がありました。
今回はオブジェクトがカメラの範囲内か範囲外かを判定して範囲内の場合のみテキストを表示させてみたいと思います。

  1. オブジェクトをクリックするとオブジェクト名の一部を表示する
  2. どの距離でも同じサイズのテキストを表示させる
  3. カメラの範囲内にオブジェクトが写っている時のみ表示する ※【今回】※

環境

Unity 2020.3.12f1を使います。
unity3d.com
この記事で作成したプロジェクトを元に作成していきます。
madai21.hatenablog.com

オブジェクトがカメラの範囲内か範囲外かを判定して範囲内の場合のみテキストを表示させてみる

ブジェクトがカメラの範囲内か範囲外かを判定するにはどう実現したらいいでしょうか?
それはWorldToViewportPointで実現させます。
SphereTextController.csを開いて以下の内容に編集します。

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

public class SphereTextController : MonoBehaviour
{
    public Camera cam;
    public GameObject target;
 
    private RectTransform rect;
    private GameObject textObject;
    // Start is called before the first frame update
    void Start()
    {
        rect = GetComponent<RectTransform>();
        textObject = transform.Find("Text")?.gameObject;
    }
 
    // Update is called once per frame
    void Update()
    {
        if (cam == null || target == null || rect == null || textObject == null)
        {
            return;
        }
 
        rect.position = cam.WorldToScreenPoint(target.transform.position) + new Vector3(0.0f, 10.0f, 0.0f);
         
        var vp = cam.WorldToViewportPoint(target.transform.position);
        bool active = vp.x >= 0.0f && vp.x <= 1.0f && vp.y >= 0.0f && vp.y <= 1.0f && vp.z >= 0.0f;
        textObject.SetActive(active);
    }
}


ワールド座標をCameraのビューポートに変換してくれます。
XとYが0.0~1.0の範囲、Zが0以上の時に該当座標がカメラの範囲内に収まっていると判断できます。

cam.WorldToViewportPoint(target.transform.position)


実行してみましょう。
カメラの範囲外のオブジェクトは情報が表示されなくなりましたね^^

おわりに

3回に渡ってオブジェクト表示を行いました。
これでカメラの範囲内の特定オブジェクトをクリックすると、どの距離でも同じサイズでオブジェクトの情報を表示させるようにすることができました^^
今回作成したUnityプロジェクトは以下の場所から取得できます。
ご自由にご利用下さい。
github.com