我有两个Gameobjects A和B,我想检测触发器b / w它们。请记住,由于性能原因,我不想将 Rigidbody 与对手或 Physics.Raycast 一起使用。
我不想使用Raycast,因为它很贵,而且也是Rigidbody因为它不允许区分which Object trigger the Another (like did car hit the motorcycle or motorcylce hit the car).
所以我的简单问题是,有没有第三,第四,第五或第六种方式可用于检测触发而不使用任何 Raycast / Rigidbody / Collider ?
答案 0 :(得分:5)
Unity中的平面由原点(位置矢量)和法线(垂直于平面的方向矢量)定义。例如,具有原始Vector3.zero和普通Vector3.up
的平面var plane = new Plane(Vector3.up, Vector3.zero); // new Plane(normal, origin)
在X / Z轴上创建一个理论平面,其大小无限并位于原点。确保正常的vecor正常化!
使用 Plane.Raycast(ray)方法,输入光线并从交叉点接收距离。然后,将此距离输入光线内的 Ray.GetPoint(距离)方法。像这样:
// var plane from before
var distance : float;
plane.Raycast (new Ray(Vector3(0, 10, 0), -Vector3.up), distance);
var point = Ray.GetPoint(distance);
Debug.Log(point.ToString());
代码应该打印"(0,10,0)",因为光线从原点上方的Y轴开始以10个单位开始,并且在它撞击飞机之前向下行进10个单位。
以下是使用Plane结构和Ray结构有效计算交点的示例。
public Plane groundPlane;
void Update() {
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
Vector3 point = GetIntersectionPoint(groundPlane, ray)
Debug.Log(point.ToString());
}
}
Vector3 GetIntersectionPoint(Plane plane, Ray ray) {
float rayDistance;
if (plane.Raycast(ray, out rayDistance))
{
return ray.GetPoint(rayDistance);
}
}
不要被使用的Ray结构所欺骗。 plane.Raycast()使用光线进行矢量线计算和平面,将该线上的距离返回到交点。
答案 1 :(得分:0)
也许像Physics.Overlap这样的东西? https://docs.unity3d.com/ScriptReference/Physics.OverlapSphere.html