C# I have written code for the player to shoot at the mouse cursor but it always shoots to the bottom left of the screen.

Hi, I’m a bit stuck. I’ve been writing code for my player to shoot bullets at the mouse cursor.
I’ve read a lot of posts on here on how to do it but my problem is that when i instantiate my bullet it always fires to the bottom left area. The direction is affected by the position of the mouse cursor but only by a few degrees. I’ve searched for tutorials on how to do it but have come up short.
My game is in a 3D space but everything is on a 2D axis.

If anyone could offer some advice id really appreciate it.

public float bulletVelocity = 5f;
public GameObject bullet;
public GameObject bullet1;
public Transform whereBulletsFireFrom;
// Use this for initialization
void Start () {
	
}

// Update is called once per frame
void Update () {
    if (Input.GetMouseButtonDown(0))
    {
        
        Vector3 worldMousePos = Camera.main.ScreenToWorldPoint(transform.position);
        Vector2 direction = (Vector2)((worldMousePos - (Input.mousePosition)));
        direction.Normalize();
        // Creates the bullet locally
        GameObject bullet = (GameObject)Instantiate(bullet1,whereBulletsFireFrom.position + (Vector3)(direction * 0.5f),
                                Quaternion.identity);
        // Adds velocity to the bullet
        bullet.GetComponent<Rigidbody>().velocity = direction * bulletVelocity;
    }
}

}

[\code]

You need to transform the mousePosition to world space and not your character’s position.

void Update () {
     if (Input.GetMouseButtonDown(0))
     {
         
         Vector3 worldMousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
         Vector2 direction = (Vector2)(worldMousePos - transform.position);
         direction.Normalize();
         // Creates the bullet locally
         GameObject bullet = (GameObject)Instantiate(bullet1,whereBulletsFireFrom.position + (Vector3)(direction * 0.5f),
                                 Quaternion.identity);
         // Adds velocity to the bullet
         bullet.GetComponent<Rigidbody>().velocity = direction * bulletVelocity;
     }

You have to account for your camera’s direction. Also, I’m not a fan of ScreenToWorldPoint at all as you’re allowing Unity to make an assumption about where your screen point’s 3d representation sits in the world.

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        // It's more intuitive to just get the object's appearance on screen.  Casting
        // a screen point into the world is a little murky as you aren't always sure
        // of where it will end up.
        //
        Vector3 mouse = Input.mousePosition;
        Vector3 thisOnScreen = Camera.main.WorldToScreenPoint(this.transform.position);

        // These screen points are relative to our camera's transform, so we need to incorporate that.
        Transform camera = Camera.main.transform;

        // Get the noramlized difference between our mouse and object's screen representation
        Vector3 direction = (mouse - thisOnScreen).normalized;
        Vector3 relative = direction.x * camera.right + direction.y * camera.up + direction.z * camera.forward;

        // Sanity Check
        Debug.DrawLine(this.transform.position, relative + this.transform.position, Color.red, 5f);

        Vector3 adjustedSpawn = whereBulletsFireFrom.position + relative / 2;
        GameObject bullet = (GameObject)Instantiate(bullet1, adjustedSpawn, Quaternion.identity);

        // Adds velocity to the bullet
        bullet.GetComponent<Rigidbody>().velocity = relative * bulletVelocity;
    }
}