Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mouse based aiming Unity3d

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.

like image 614
Krishna Kumar Avatar asked Oct 25 '25 04:10

Krishna Kumar


1 Answers

Using Camera.ScreenToWorldPoint is wrong in this situation.

You should be using raycasting against a plane. Here's a demonstration without unnecesary math:

raycasting mouse position against a plane

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

like image 146
Krzysztof Bociurko Avatar answered Oct 27 '25 17:10

Krzysztof Bociurko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!