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

时间:2015-02-14 19:57:35

标签: c# unity3d game-physics

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

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

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

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

例如,让我们说我的对象是这个球体

enter image description here

现在,我怎样才能返回一个表示左边没有对象的数组(null),前面有一个对象为1,右边有一个对象为0.5?

感谢您的耐心和理解

1 个答案:

答案 0 :(得分:1)

我不确定你要达到的目标......

如果你不想在0.5,1,1.5等处获得潜在的物体,那就说Z轴你可能想用raycasting来做这件事。

如果你想检查任何返回方向依赖于Z轴(0.5,0.856,1.45等)的物体,你可能要么

  1. 使用缩放的球体对撞机并将碰撞对象与OnCollisionEnter回调添加到数组/列表
  2. 遍历场景的每个对象并检查它的相对位置
  3. 在程序上使用Raycast探针(使用密度浮点和Raycasting Z轴上的每个密度偏移并检查光线是否碰到任何东西......)
  4. ...
  5. 完全取决于您的使用情况,以及您使用的是2D还是3D。

    Seneral

    编辑:这是你想要在2D中在方向y 1(在单位2D中向上)的图层optionalWallLayer上获得范围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
     }
    

    这可能会进入你的球体MonoBehaviour的更新功能。

    如果您不确定是否要碰到障碍物,那么使用球体对撞机的选项很有用。如果它们很小,您可能希望将所述球形碰撞器作为组件添加到球体中,将其扩展到最大距离,并将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);
        }
    }
    

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