获取一个对象的点与另一个对象之间的距离

Getting distance between point of an object and another object

首先,我想道歉,因为这是一个非常基本和重复的问题,但我对游戏开发完全陌生。

我知道我可以使用以下方法找到两个对象之间的距离:

float dist = Vector3.Distance(other.position, transform.position);

但是,如何找到一个物体的点到另一个物体的距离?

例如,假设我的对象是这个球体

现在,我怎样才能 return 一个数组,它表示左边没有对象 (null),前面有一个对象位于 1,右边有一个对象位于0.5?

感谢您的耐心和理解

我不太确定你不想实现什么...

如果您不想在 0.5、1、1.5 等处获得潜在对象,可以说是 Z 轴,您可能希望使用 raycasting 来执行此操作。

相反,如果您希望检查返回依赖于 Z 轴(0.5、0.856、1.45 等)方向的任何对象,您可能会

  1. 使用缩放球体碰撞器并将碰撞对象与 OnCollisionEnter 回调添加到 array/List
  2. 遍历场景中的每个对象并检查它的相对位置
  3. 按程序使用光线投射探测器(使用密度浮点和光线投射 Z 轴上的每个密度偏移并检查光线是否击中任何东西...)
  4. ...

完全取决于您的使用情况,以及您使用的是 2D 还是 3D。

上将

编辑:这是您想要在 2D 中在 optionalWallLayer 层上沿 y 1 方向(向上统一 2D)获得范围为 maxRange 的墙

 float maxRange = 10.0f;
 RaycastHit hit; 
 Vector3 dir = transform.TransformDirection(new Vector3 (0, 1, 0));
 if (Physics.Raycast(transform.position, dir, maxRange, out hit, LayerMask optionalWallLayer)) 
 {
     Debug.Log ("Wall infront of this object in Range" + hit.distance);
     // hit contains every information you need about the hit
     // Look into the docs for more information on these
 }

这可能会进入您的 Sphere 的 MonoBehaviour 的更新功能。

如果您不确定是否要撞到障碍物,球体碰撞器的选项很有用。如果这些很小,您可能希望将所述 Sphere Collider 作为一个组件添加到您的球体中,将其放大到您的最大距离,并向球体添加一个 MonoBehaviour 脚本,其中包含如下内容:

public List<Transform> allObjectsInRange; // GameObjects to enclose into calculations, basically all which ever entered the sphere collider.
public List<float> relatedDistances;

void Update () {
    // basic loop to iterate through each object in range to update it's distance in the Lists IF YOU NEED...
    for (int cnt = 0; cnt < allObjectsInRange.Count; cnt++) {
        relatedDistances[cnt] = Vector2.Distance (transform.position, allObjectsInRange[cnt].position);
    }
}

// Add new entered Colliders (Walls, entities, .. all Objects with a collider on the same layer) to the watched ones
void OnCollisionEnter (Collision col) {
    allObjectsInRange.Add (col.collider.transform);
    relatedDistances.Add (Vector2.Distance (transform.position,  col.collider.transform));
}

// And remove them if they are no longer in reasonable range
void OnCollisionExit (Collision col) {
    if (allObjectsInRange.Contains (col.collider.transform)) {
        relatedDistances.RemoveAt (allObjectsInRange.IndexOf (col.collider.transform));
        allObjectsInRange.Remove (col.collider.transform);
    }
}

应该这样做,根据您的具体情况,再次选择任一选项:) 注意两者都是伪代码...希望它有所帮助!