Без разворотов
Урок 3 из 14 курса Игра на Unity: 3D-змейка на Coddy.
Змея, которая сразу поворачивает назад, врезается в собственную шею, поэтому поворот в противоположную сторону игнорируется. Направление, противоположное заданному, является его отрицательным: когда змея движется вправо, -direction — это Vector3.left.
Проверять только direction недостаточно, если нажатие сразу же меняет его: змея движется вправо, игрок нажимает вверх, а затем влево в пределах одного шага. Поворот вверх разрешён, затем поворот влево проверяется относительно направления вверх и тоже разрешён, а следующий шаг проходит назад через шею.
Поэтому храни два направления: direction — направление, в котором голова двигалась в последний раз, и nextDirection — поворот, ожидающий следующего шага. При нажатии клавиши значение nextDirection меняется после сравнения с direction, а следующий шаг применяет ожидаемый поворот.
Задание
ЛегкоНе позволяй змее резко разворачиваться и двигаться прямо на себя.
- Добавь
private Vector3 nextDirection = Vector3.right;иvoid Turn(Vector3 newDirection): присваивай значение nextDirection, еслиnewDirection == -directionне выполняется. - В
Update()каждая клавиша должна вызыватьTurnс соответствующим направлением, а не задавать direction. - В начале
Step()присвойdirection = nextDirection;
Нажми «Играть» и нажми влево, пока движешься вправо: змея продолжит двигаться вправо. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // секунды между двумя шагами
private float timer;
private Vector3 direction = Vector3.right;
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Step()
{
transform.position += direction;
}
}
Все уроки раздела Игра на Unity: 3D-змейка
Потренируйтесь самостоятельно: Песочница Unity