问题
I am making cannonball shooter game. here's a short code where I am calculating the aiming direction.
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;
This works when both ball and at angle (0,0,0). But when the angle changes, I am not able to shoot at right direction.
Suppose both ball and camera are looking at 45 degrees on right side, the same code doesn't work.
The current code assumes both are at angle (0,0,0). So in the above mentioned case, the throwing direction is always wrong.
I want to throw the ball in whatever direction it is. But assume it as 0 angle and throw accordingly.
回答1:
Using Camera.ScreenToWorldPoint
is wrong in this situation.
You should be using raycasting against a plane. Here's a demonstration without unnecesary math:
Raycasting gives you the advantage, that you don't have to guess how "deep" did the user click (the z
coordinate).
Here's a simple implementation of the above:
/// <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");
}
Demonstation: https://github.com/chanibal/Very-Generic-Missle-Command
来源:https://stackoverflow.com/questions/29689617/mouse-based-aiming-unity3d