【发布时间】:2020-01-23 18:07:25
【问题描述】:
我是 Unity 新手,在创建界面时,我试图找出两个游戏对象之间的距离。我知道如何在 C#/javascript 脚本中执行操作,但是我正在努力在场景视图中找到这些信息。移动物体时我可以按什么键来查看到它的邻居的距离?
【问题讨论】:
标签: unity3d
我是 Unity 新手,在创建界面时,我试图找出两个游戏对象之间的距离。我知道如何在 C#/javascript 脚本中执行操作,但是我正在努力在场景视图中找到这些信息。移动物体时我可以按什么键来查看到它的邻居的距离?
【问题讨论】:
标签: unity3d
在脚本中,您可以在vector3 之间使用Vector3.Distance 来获取两点之间的距离。每个游戏对象都有一个用 Vector3 表示的位置。
下面是一个脚本示例,向您展示了它是如何工作的。您只需将脚本拖到场景中的游戏对象上,然后将场景中的另一个游戏对象拖入检查器。由于 [ExecuteInEditMode],即使您不在播放模式下,该脚本也应该运行。这样您将看到 distanceBetweenObjects 实时更新,而无需实际点击播放。
using UnityEngine;
[ExecuteInEditMode]
public class DistanceBetweenTwoObjects : MonoBehaviour
{
public GameObject obj;
public float distanceBetweenObjects;
private void Update()
{
distanceBetweenObjects = Vector3.Distance(transform.position, obj.transform.position);
Debug.DrawLine(transform.position, obj.transform.position, Color.green);
}
private void OnDrawGizmos()
{
GUI.color = Color.black;
Handles.Label(transform.position - (transform.position -
obj.transform.position)/2, distanceBetweenObjects.ToString());
}
}
OnDrawGizmos 方法将在 2 个对象之间绘制显示距离值的文本,以帮助使其更加用户友好。
【讨论】:
没有任何内置功能,但使用 [ExecuteinEditMode] 将这样的读数添加到显示中是相当简单的,这会导致脚本在游戏未处于播放模式时运行。例如,这个脚本应该读出不同轴上的距离和总距离:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class EditorDistanceDisplay : MonoBehaviour
{
public GameObject target1;
public GameObject target2;
public float distanceX;
public float distanceY;
public float distanceZ;
public float distanceTotal;
void Start()
{
}
void Update()
{
Vector3 delta = target2.transform.position - target1.transform.position;
distanceX = delta.x;
distanceY = delta.y;
distanceZ = delta.z;
distanceTotal = delta.magnitude;
}
}
【讨论】: