Menu
CoddyTech

Sem retornos

Lição 3 de 14 do curso Jogo de Cobra 3D na Unity da Coddy.

Uma cobra que vira diretamente para trás esbarra no próprio pescoço, então uma virada para a direção oposta àquela em que está se movendo é ignorada. O oposto de uma direção é seu negativo: enquanto a cobra se move para a direita, -direction é Vector3.left.

Vector3 heading = Vector3.right;
Vector3 back = -heading;            // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back;   // true

Comparar com direction não é suficiente quando um pressionamento altera direction imediatamente. Movendo-se para a direita, o jogador pressiona para cima e depois para a esquerda durante um único tick. Para cima é permitido. Em seguida, esquerda é comparada com cima, a virada que ainda não aconteceu, e também é permitida, então o próximo passo vai para a esquerda, direto de volta sobre o pescoço.

A solução mantém duas direções. direction é a direção em que a cabeça se moveu no último passo; nextDirection é a virada aguardando o próximo passo. Uma tecla altera nextDirection, mas somente depois de comparar a virada com direction, e o passo começa tornando real a virada aguardada. No caso acima, esquerda é comparada com direita, a direção em que a cabeça realmente se move, e é descartada.

challenge icon

Desafio

Fácil
  1. Adicione private Vector3 nextDirection = Vector3.right;, a curva que está aguardando o próximo passo.
  2. Escreva void Turn(Vector3 newDirection): ele define nextDirection como newDirection, a menos que newDirection seja o oposto de direction.
  3. Em Update(), cada tecla chama Turn com sua direção, em vez de definir direction.
  4. No início de Step(), defina direction como nextDirection.

Pressione Play e tente voltar, depois pressione Check.

Experimente você mesmo

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // segundos entre dois passos
    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;
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Cobra 3D na Unity