Menu
CoddyTech

Стены

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

Клетки игрового поля по осям x и z располагаются от -7 до 7. Поскольку центр поля находится в точке 0, одна проверка охватывает обе стороны: Mathf.Abs(x) > 7 возвращает true за пределами любого края.

Проверяй клетку, в которую собирается войти голова, до перемещения, чтобы змея, ударившись о стену, оставалась на последней клетке, а не оказывалась за границей поля. На поле поменьше, с границей на отметке 4:

Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > 4) { Die(); return; }
transform.position = next;

Столкновение со стеной останавливает змею навсегда. Для этого нужна переменная типа bool, которую Update() проверяет в первую очередь: return в начале пропускает и обработку клавиш, и таймер.

challenge icon

Задание

Легко

Столкновение со стеной завершает игру.

  1. Добавь public int edge = 7; и public bool alive = true;
  2. В Step() после установки направления добавь Vector3 next = transform.position + direction;. Если следующая позиция находится за пределами поля (Mathf.Abs(next.x) > edge или по оси z), вызови Die() и выполни return; иначе перемести змейку в следующую позицию.
  3. void Die() { alive = false; }; Update() начинается с if (!alive) return;

Нажми «Играть» и направь змейку в стену: она остановится на последней клетке. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // секунды между двумя шагами
    private float timer;
    private Vector3 direction = Vector3.right;       // направление, в котором голова двигалась на предыдущем шаге
    private Vector3 nextDirection = Vector3.right;   // поворот, ожидающий следующего шага

    void Update()
    {
        Keyboard keyboard = Keyboard.current;
        if (keyboard != null)
        {
            if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
            if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
            if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
            if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
        }

        timer += Time.deltaTime;
        if (timer >= tick)
        {
            timer -= tick;
            Step();
        }
    }

    void Turn(Vector3 newDirection)
    {
        if (newDirection != -direction)
        {
            nextDirection = newDirection;
        }
    }

    void Step()
    {
        direction = nextDirection;
        transform.position += direction;
    }
}

Все уроки раздела Игра на Unity: 3D-змейка

Потренируйтесь самостоятельно: Песочница Unity