Menu
CoddyTech

Без разворотов

Урок 3 из 14 курса Игра на Unity: 3D-змейка на Coddy.

Змея, которая сразу поворачивает назад, врезается в собственную шею, поэтому поворот в противоположную сторону игнорируется. Направление, противоположное заданному, является его отрицательным: когда змея движется вправо, -direction — это Vector3.left.

Проверять только direction недостаточно, если нажатие сразу же меняет его: змея движется вправо, игрок нажимает вверх, а затем влево в пределах одного шага. Поворот вверх разрешён, затем поворот влево проверяется относительно направления вверх и тоже разрешён, а следующий шаг проходит назад через шею.

Поэтому храни два направления: direction — направление, в котором голова двигалась в последний раз, и nextDirection — поворот, ожидающий следующего шага. При нажатии клавиши значение nextDirection меняется после сравнения с direction, а следующий шаг применяет ожидаемый поворот.

challenge icon

Задание

Легко

Не позволяй змее резко разворачиваться и двигаться прямо на себя.

  1. Добавь private Vector3 nextDirection = Vector3.right; и void Turn(Vector3 newDirection): присваивай значение nextDirection, если newDirection == -direction не выполняется.
  2. В Update() каждая клавиша должна вызывать Turn с соответствующим направлением, а не задавать direction.
  3. В начале 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