获取一个对象的点与另一个对象之间的距离
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 等)方向的任何对象,您可能会
- 使用缩放球体碰撞器并将碰撞对象与 OnCollisionEnter 回调添加到 array/List
- 遍历场景中的每个对象并检查它的相对位置
- 按程序使用光线投射探测器(使用密度浮点和光线投射 Z 轴上的每个密度偏移并检查光线是否击中任何东西...)
- ...
完全取决于您的使用情况,以及您使用的是 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);
}
}
应该这样做,根据您的具体情况,再次选择任一选项:) 注意两者都是伪代码...希望它有所帮助!
首先,我想道歉,因为这是一个非常基本和重复的问题,但我对游戏开发完全陌生。
我知道我可以使用以下方法找到两个对象之间的距离:
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 等)方向的任何对象,您可能会
- 使用缩放球体碰撞器并将碰撞对象与 OnCollisionEnter 回调添加到 array/List
- 遍历场景中的每个对象并检查它的相对位置
- 按程序使用光线投射探测器(使用密度浮点和光线投射 Z 轴上的每个密度偏移并检查光线是否击中任何东西...)
- ...
完全取决于您的使用情况,以及您使用的是 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);
}
}
应该这样做,根据您的具体情况,再次选择任一选项:) 注意两者都是伪代码...希望它有所帮助!