Как осуществить движение по вектору в 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 шт):
Обратите внимание на эту строчку:
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.