Как исправить пулевое вращение в Unity? (2D) - PullRequest
0 голосов
/ 29 января 2020

Так что у меня проблемы со скриптом, который у меня есть, в основном он поворачивает графику игрока в зависимости от того, куда нацеливается мышь. Это работает нормально и как задумано, но моя проблема в том, что когда я хочу стрелять в противоположном направлении, то есть в левом направлении, он стреляет в игрока вместо того, к чему он стремится.

Я решил записать небольшое видео, чтобы показать проблему.

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

1 Ответ

1 голос
/ 29 января 2020

Попробуйте:

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

Также не забудьте проверить, где находится игрок, потому что вы не хотите стрелять со спины. Используя вышеприведенные углы Эйлера, одна сторона равна 90, а другая составляет 270 градусов по компоненте y.

...