找到离线最近的玩家[Unity3D]
find nearest player to line [Unity3D]
我想找到离直线最近的玩家,更具体地说,我在屏幕中央有目标指示器,想象一下我的角色和那个目标指示器之间有一条线,我会附上图片更清楚,如果目标指示器不在其他玩家身上,我想让离那条线最近的玩家受到伤害。
我找不到任何解决方案,希望我解释清楚,
可以用unity的Ray
class,数学上相当于一条线。
在下面找到两个你可以使用的有用函数,用叉积计算距离,然后用平方距离找到最近的,而不是为了效率而计算距离。
平方根的计算效率不高,因此最好避免使用它们。对于这种情况是有意义的,因为您需要最短的距离,所以您可以使用 .sqrMagnitude
。如果您需要距离本身,那么您可以使用 .magnitude
(距离本身)。但是,如果您不打算使用平方根,或者 Update()
中的 .magnitude
这不是错误交易)。
public float DistancePointToLineSqr(Ray ray, Vector3 point) {
return Vector3.Cross(ray.direction, point - ray.origin).sqrMagnitude;
}
private Vector3 GetClosestToLinePoint(List<Vector3 points>) {
Ray vertical = new Ray(transform.position, Vector3.up);
Vector3 closestPoint = points.OrderBy(point => DistancePointToLineSqr(vertical, point)).FirstOrDefault();
return closestPoint;
}
对于您的台词,当您提到目标指标时,您可能会发现 Camera.ScreenPointToRay 有用。
我想找到离直线最近的玩家,更具体地说,我在屏幕中央有目标指示器,想象一下我的角色和那个目标指示器之间有一条线,我会附上图片更清楚,如果目标指示器不在其他玩家身上,我想让离那条线最近的玩家受到伤害。 我找不到任何解决方案,希望我解释清楚,
可以用unity的Ray
class,数学上相当于一条线。
在下面找到两个你可以使用的有用函数,用叉积计算距离,然后用平方距离找到最近的,而不是为了效率而计算距离。
平方根的计算效率不高,因此最好避免使用它们。对于这种情况是有意义的,因为您需要最短的距离,所以您可以使用 .sqrMagnitude
。如果您需要距离本身,那么您可以使用 .magnitude
(距离本身)。但是,如果您不打算使用平方根,或者 Update()
中的 .magnitude
这不是错误交易)。
public float DistancePointToLineSqr(Ray ray, Vector3 point) {
return Vector3.Cross(ray.direction, point - ray.origin).sqrMagnitude;
}
private Vector3 GetClosestToLinePoint(List<Vector3 points>) {
Ray vertical = new Ray(transform.position, Vector3.up);
Vector3 closestPoint = points.OrderBy(point => DistancePointToLineSqr(vertical, point)).FirstOrDefault();
return closestPoint;
}
对于您的台词,当您提到目标指标时,您可能会发现 Camera.ScreenPointToRay 有用。