Игрок нажимает на стрелку и куб двигается в указанном направлении, при этом он должен вращаться в указанную сторону. Прежде чем сделать движение плавным, я хотел чтобы он просто переходил из начального в конечное положение. Получилось вот так:
Код движения:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//[RequireComponent(typeof(Rigidbody))]
public class CubeMovement : MonoBehaviour {
//private Rigidbody rigidBody;
[SerializeField] private float turnDelay = 0.4f;
private bool canMove = true;
//private void Awake() => rigidBody = GetComponent<Rigidbody>();
private void Update() {
if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow))
Move(Vector3.forward);
else if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow))
Move(Vector3.left);
else if (Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow))
Move(Vector3.back);
else if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow))
Move(Vector3.right);
}
private void Move(Vector3 direction) {
if (canMove) {
canMove = false;
StartCoroutine(MoveRoutine(direction));
}
}
private IEnumerator MoveRoutine(Vector3 direction) {
transform.position += direction;
float x = direction.z == 0 ? 0 : direction.z;
float z = direction.x == 0 ? 0 : -direction.x;
transform.Rotate(new Vector3(x, 0f, z) * 90f);
yield return new WaitForSeconds(turnDelay);
canMove = true;
}
}
Пока куб движется по прямым линиям, связанным со стартовой позицией, всё ок. Но как только нужно стать на одну клетку по диагонали (схема ниже), то он начинает неправильно поворачиваться.
Выглядит это так:
Нормальное движение от центра вперёд и вправо по отдельности:
И вот что получается, используя эти движения последовательно:
Я пробовал найти закономерности, но все они работают до тех пор, пока очередной раз не сойти в сторону. Подскажите, как же всё-таки его повернуть правильно, не плодя сотни if-else?
PS. если у вас аналогичный вопрос - моё решение в первом комментарии.