Muh*_*han 0 c# unity-game-engine
我有两个游戏对象A和B,我想检测触发器b / w。请记住,由于性能原因,我既不想将Rigidbody用于对撞机,也不想使用Physics.Raycast。
我不想使用Raycast,因为它很贵,而且Rigidbody也不允许使用它区分哪个对象触发另一个对象(例如汽车撞摩托车或摩托车撞了汽车)。
因此,我的简单问题是,是否可以使用第三,第四,第五或第六种方法而不使用任何Raycast / Rigidbody / Collider来检测触发器?
Unity中的平面由原点(位置矢量)和法线(垂直于该平面的方向矢量)定义。例如,原点为Vector3.zero且法线为Vector3.up的飞机
var plane = new Plane(Vector3.up, Vector3.zero); // new Plane(normal, origin)
Run Code Online (Sandbox Code Playgroud)
在X / Z轴上创建一个理论平面,该平面的大小是无限的并且位于原点。确保正常的vecor正常化!
使用Plane.Raycast(ray)方法,输入射线并接收到相交点的距离。然后,将此距离输入到ray内部的Ray.GetPoint(distance)方法中。像这样:
// 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());
Run Code Online (Sandbox Code Playgroud)
该代码应打印“(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);
}
}
Run Code Online (Sandbox Code Playgroud)
不要被使用的Ray结构所欺骗。所述plane.Raycast()使用为射线矢量线计算与平面和返回的距离在该行的交点。
| 归档时间: |
|
| 查看次数: |
3446 次 |
| 最近记录: |