@Ezekiel4
Охотник на пиратов и сборщик монолитов

Как сделать движение куба с вращением?

Игрок нажимает на стрелку и куб двигается в указанном направлении, при этом он должен вращаться в указанную сторону. Прежде чем сделать движение плавным, я хотел чтобы он просто переходил из начального в конечное положение. Получилось вот так:
Код движения:

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


Пока куб движется по прямым линиям, связанным со стартовой позицией, всё ок. Но как только нужно стать на одну клетку по диагонали (схема ниже), то он начинает неправильно поворачиваться.
628cb682b99e6603233035.png
Выглядит это так:

Нормальное движение от центра вперёд и вправо по отдельности:
628cba27c57a2328805303.png
И вот что получается, используя эти движения последовательно:
628cbc4334aac350239852.png


Я пробовал найти закономерности, но все они работают до тех пор, пока очередной раз не сойти в сторону. Подскажите, как же всё-таки его повернуть правильно, не плодя сотни if-else?

PS. если у вас аналогичный вопрос - моё решение в первом комментарии.
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
EveningEugene
@EveningEugene
Unity-разраб
Вот в этом видео понятно и с визуализацией объясняется, как это реализовать. Да, по-английски, но это всего полторы минуты и с визуализацией. Конкретного кода с решением нет, но сам принцип становится понятен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы