首先,我想道歉,因为这是一个非常基本和重复的问题,但我对游戏开发完全不熟悉。
我知道我可以使用以下方法找到两个物体之间的距离:
float dist = Vector3.Distance(other.position, transform.position);
但是,如何找到一个物体的一个点与另一个物体之间的距离?
例如,让我们说我的对象是这个球体
现在,我怎样才能返回一个表示左边没有对象的数组(null),前面有一个对象为1,右边有一个对象为0.5?
感谢您的耐心和理解
答案 0 :(得分:1)
我不确定你要达到的目标......
如果你不想在0.5,1,1.5等处获得潜在的物体,那就说Z轴你可能想用raycasting来做这件事。
如果你想检查任何返回方向依赖于Z轴(0.5,0.856,1.45等)的物体,你可能要么
完全取决于您的使用情况,以及您使用的是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);
}
}
应该这样做,根据您的具体情况,选择其中一个选项:)注意两者都是伪代码...希望它有所帮助!