PaperRockNinja
PaperRockNinja

Reputation: 23

How to fix Bullet Rotation in Unity? (2D)

So i'm having issues with a script I have, what it does is basically rotate the player graphics depending on where the mouse is aiming at. This works fine and as intended but my issue is that when I want to shoot on the opposite direction, that being the Left direction, it shoots the player instead of where it's aiming at.

I've decided to record a small video to show the problem.

https://streamable.com/02zqz

Here's the code to both the rotation and weapon script.

Rotating

public class Rotating : MonoBehaviour
{
    public PlayerController player;
    public float x;

    public Vector3 flipArm;

    void Start()
    {
        x = transform.localScale.x;
        flipArm = transform.localScale;
        player = GetComponentInParent<PlayerController>();

    }

    void Update()
    {
        Vector3 difference = Camera.main.ScreenToWorldPoint(Input.mousePosition ) - transform.position;
        difference.Normalize();

        float rotZ = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;

        transform.rotation = Quaternion.Euler(0f, 0f, rotZ + 0);

        if(difference.x >= 0)
        {
            transform.rotation = Quaternion.Euler(0f, 0f, rotZ);
            player.armRight = true;
        }
        else
        {
            transform.rotation = Quaternion.Euler(0f, 0f, rotZ+180);
            player.armRight = false;
        }
    }
}

Weapon

public class Weapon : MonoBehaviour
{
    public float shootDelay = 0;
    public float damage = 1;

    public LayerMask whatToHit;

    public Transform firePoint;

    public GameObject bullet;

    // Start is called before the first frame update
    void Start()
    {
        firePoint = transform.Find("FirePoint");
    }

    // Update is called once per frame
    void Update()
    {
        shootDelay += Time.deltaTime;
        if(shootDelay >= 0.1f)
        {
            if(Input.GetMouseButton(0))
            {
                shootDelay = 0;
                Shot();
            }
        }
    }

    public void Shot()
    {
        Vector2 mousepos = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);

        Vector2 firepointpos = new Vector2(firePoint.position.x, firePoint.position.y);

        Instantiate(bullet, firepointpos, transform.rotation);

        Debug.DrawLine(firepointpos, (mousepos - firepointpos) * 100, Color.cyan);
    }
}

Upvotes: 0

Views: 1615

Answers (1)

Arutyun Enfendzhyan
Arutyun Enfendzhyan

Reputation: 1909

Try this:

transform.rotation = Quaternion.LookRotation ( end - start );

Also don't forget to check where the player is facing because you don't want to shoot from back. Using the above euler angles, one side is 90 and another 270 degrees in y component.

Upvotes: 1

Related Questions