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; // trueComparar 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.
Desafio
Fácil- Adicione
private Vector3 nextDirection = Vector3.right;, a curva que está aguardando o próximo passo. - Escreva
void Turn(Vector3 newDirection): ele definenextDirectioncomonewDirection, a menos quenewDirectionseja o oposto dedirection. - Em
Update(), cada tecla chamaTurncom sua direção, em vez de definirdirection. - No início de
Step(), definadirectioncomonextDirection.
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;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.