基于鼠标的瞄准 Unity3d
Mouse based aiming Unity3d
我正在制作炮弹射击游戏。这是我计算瞄准方向的简短代码。
Vector3 mousePos = Input.mousePosition;
mousePos.z = thisTransform.position.z - camTransform.position.z;
mousePos = mainCamera.ScreenToWorldPoint (mousePos);
Vector3 force = mousePos - thisTransform.position;
force.z = force.magnitude;
这适用于球和角度 (0,0,0)。但是当角度改变的时候,我就拍不对了。
假设球和相机都在右侧 45 度角,相同的代码不起作用。
当前代码假定两者都成角度 (0,0,0)。所以在上面提到的情况下,投掷方向总是错误的。
我想把球扔向任何方向。但假设它为 0 角度并相应地抛出。
在这种情况下使用 Camera.ScreenToWorldPoint
是错误的。
您应该对平面使用光线投射。这是一个没有不必要的数学的演示:
光线投射给您带来的优势是,您不必猜测 "deep" 用户是如何点击的(z
坐标)。
下面是上面的简单实现:
/// <summary>
/// Gets the 3D position of where the mouse cursor is pointing on a 3D plane that is
/// on the axis of front/back and up/down of this transform.
/// Throws an UnityException when the mouse is not pointing towards the plane.
/// </summary>
/// <returns>The 3d mouse position</returns>
Vector3 GetMousePositionInPlaneOfLauncher () {
Plane p = new Plane(transform.right, transform.position);
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
float d;
if(p.Raycast(r, out d)) {
Vector3 v = r.GetPoint(d);
return v;
}
throw new UnityException("Mouse position ray not intersecting launcher plane");
}
我正在制作炮弹射击游戏。这是我计算瞄准方向的简短代码。
Vector3 mousePos = Input.mousePosition;
mousePos.z = thisTransform.position.z - camTransform.position.z;
mousePos = mainCamera.ScreenToWorldPoint (mousePos);
Vector3 force = mousePos - thisTransform.position;
force.z = force.magnitude;
这适用于球和角度 (0,0,0)。但是当角度改变的时候,我就拍不对了。
假设球和相机都在右侧 45 度角,相同的代码不起作用。
当前代码假定两者都成角度 (0,0,0)。所以在上面提到的情况下,投掷方向总是错误的。
我想把球扔向任何方向。但假设它为 0 角度并相应地抛出。
在这种情况下使用 Camera.ScreenToWorldPoint
是错误的。
您应该对平面使用光线投射。这是一个没有不必要的数学的演示:
光线投射给您带来的优势是,您不必猜测 "deep" 用户是如何点击的(z
坐标)。
下面是上面的简单实现:
/// <summary>
/// Gets the 3D position of where the mouse cursor is pointing on a 3D plane that is
/// on the axis of front/back and up/down of this transform.
/// Throws an UnityException when the mouse is not pointing towards the plane.
/// </summary>
/// <returns>The 3d mouse position</returns>
Vector3 GetMousePositionInPlaneOfLauncher () {
Plane p = new Plane(transform.right, transform.position);
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
float d;
if(p.Raycast(r, out d)) {
Vector3 v = r.GetPoint(d);
return v;
}
throw new UnityException("Mouse position ray not intersecting launcher plane");
}