Как осуществить движение по вектору в Unity2D?

Делаю игру с видом сверху. Когда нажимаю стрелку вправо, моделька начинает вращаться вправо находясь при этом на своем месте. Когда нажимаю на стрелку влево - аналогично, только вращение происходит в левую сторону. Когда отпускаю моделька перестает вращаться. При этом у модельки (самолета, в данном случае) есть носовая часть, т.е. когда я отпускаю кнопку вращения, нос самолета может смотреть куда угодно.

Вопрос: Подскажите пожалуйста, как сделать чтобы на кнопку стрелка вверх самолет начал движение исходя из того в какую сторону повернута его носовая часть? Надеюсь, правильно объяснил :) Вот код.

//выше только объявление переменных
    private void Start()
{
    _rigidbody = GetComponent<Rigidbody2D>();
    _animator = GetComponent<Animator>();
    _spriteRenderer = GetComponentInChildren<SpriteRenderer>();
}

private void Update()
{
    Move();
}

private void Move()
{
    Vector2 direction = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
    _moveVelocity = direction.normalized * Speed;

    if (direction.x < 0.0F)
    {
        transform.Rotate(Vector3.forward * SpeedOfTurn);
    }

    if (direction.x > 0.0F)
    {
        transform.Rotate(Vector3.back * SpeedOfTurn);
    }
}

private void FixedUpdate()
{
    if (Input.GetKey(KeyCode.UpArrow))
    {
        //т.е. на данный момент он летит просто вверх не зависимо от того куда смотрит сама моделька самолета
        _rigidbody.MovePosition(_rigidbody.position + _moveVelocity * Time.fixedDeltaTime);
    }
}

Ответы (1 шт):

Автор решения: ssa112112

Обратите внимание на эту строчку:

Vector2 direction = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));

Вы рассчитываете direction на основании нажатых стрелочек. Соответственно, когда стрелки поворота нажаты вы можете управлять кораблём. В этом легко убедится, нажав одновременно вбок и вверх или выведя direction в консоль:

Debug.Log(direction);

Вместо этого стоит рассчитывать направление движения на основании z-координаты вашего GameObject. Это можно сделать следующим образом. Во-первых в методе Start сохранить изначальный поворот в поле класса startRotationZ

 startRotationZ = 360 - transform.eulerAngles.z; //Если ваша модель будет лететь задом/боком измените число 360

А затем, в методе Move каждый раз обновлять текущий поворот и текущее направление движения.

 var currentRotationZinRadians = (transform.eulerAngles.z + startRotationZ) * Mathf.Deg2Rad;
 var currentDirection = new Vector2(Mathf.Cos(currentRotationZinRadians), Mathf.Sin(currentRotationZinRadians));
 _moveVelocity = сurrentDirection * Speed;

PS: а ещё, если в transform.Rotate добавить умножение на Time.DeltaTime ваш поворот станет плавным и вы получите поведение, похожее на полет самолета в 2D.

→ Ссылка