如何修复 Unity 中的子弹旋转? (二维)

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

所以我的脚本有问题,它所做的基本上是根据鼠标瞄准的位置旋转播放器图形。这工作正常并且符合预期但我的问题是当我想朝相反的方向射击时,即向左方向,它会射击玩家而不是它瞄准的地方。

我决定录制一个小视频来展示这个问题。

https://streamable.com/02zqz

这是旋转和武器脚本的代码。

旋转

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;
        }
    }
}

武器

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);
    }
}

试试这个:

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

另外不要忘记检查玩家面向的位置,因为您不想从后面射击。使用上述欧拉角,y 分量的一侧为 90 度,另一侧为 270 度。