注1:在此工程中,我用的为此版本
一、实现目标
实现不同视角下的测距,在前文中,我一共创建一个四中不同的视角,而在本篇中我将实现,在不同视角中都能实时测距的功能。
二、实现方法
循环遍历4个视角相机,将实时为isActiveAndEnabled为True的设为Target:
for (int i = 0; i < cameras.Length; i++)
{
//此处我遇到一个坑,对于Camera类的判断需要用isActiveAndEnabled
//只用enabled的话会一直返回true,无论Camera是否激活
if (cameras[i].isActiveAndEnabled)
{
target = cameras[i].transform; // 将激活的相机的Transform赋值给target
break;
}
}
三、具体步骤
第一步:确保有四个相机对象,和一个TM或者TMP。
第二步:创建脚本 -- Ranging
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
/// <summary>
///
/// 实现不同视角下的测距
/// </summary>
public class Ranging : MonoBehaviour
{
public Camera[] cameras; // 在Inspector中拖拽所有需要切换的相机到这里
private Transform target; // 人物对象的Transform(在Inspector中拖拽人物对象到这里)
public TextMesh distanceText; // 跟随方块的TextMeshPro(在Inspector中拖拽TextMeshPro对象到这里)
// Start is called before the first frame update
public void Start()
{
}
// Update is called once per frame
void Update()
{
//遍历相机数组,找到激活的相机,将其复制给target
for (int i = 0; i < cameras.Length; i++)
{
if (cameras[i].isActiveAndEnabled)
{
target = cameras[i].transform; // 将激活的相机的Transform赋值给target
break;
}
}
// 计算人物到方块的直线距离
float distance = Vector3.Distance(transform.position, target.position);
// 格式化距离显示
string distanceDisplay = distance.ToString("0.00");
// 更新TextMeshPro的内容
distanceText.text = distanceDisplay;
// 更新TextMeshPro的位置,使其跟随方块
distanceText.transform.position = transform.position + new Vector3(0, 1f, 0); // 这里假设Text在方块上方1单位,根据需要调整
distanceText.transform.LookAt(Camera.main.transform);
}
}
第三步:将脚本链接到需要测量距离的某个对象上
四、结果测试
无论在何种视角下,都能实现实时的测距
五、结果分析
仍需后期加贴图