Sem retorno
Lição 3 de 14 do curso Jogo 3D da Cobrinha na Unity da Coddy.
Uma cobra que vira diretamente para trás acaba atingindo o próprio pescoço, então uma virada para a direção oposta é ignorada. O oposto de uma direção é o seu negativo: enquanto a cobra se move para a direita, -direction é Vector3.left.
Comparar com direction não é suficiente quando um pressionamento a altera imediatamente: movendo-se para a direita, o jogador toca para cima e, em seguida, para a esquerda, dentro de um único ciclo. A direção para cima é permitida; depois, a direção para a esquerda é comparada com a direção para cima e também é permitida, e o próximo movimento volta pelo pescoço.
Então, mantenha duas direções: direction, o caminho que a cabeça percorreu por último, e nextDirection, a virada que está aguardando o próximo movimento. Uma tecla altera nextDirection depois de compará-la com direction, e o movimento torna real a virada que estava aguardando.
Desafio
FácilImpeça a cobra de virar diretamente de volta para o próprio pescoço.
- Adicione
private Vector3 nextDirection = Vector3.right;evoid Turn(Vector3 newDirection): defina nextDirection, a menos quenewDirection == -direction. - Em
Update(), cada tecla chamaTurncom a direção correspondente, em vez de definir direction. - No início de
Step(), definadirection = nextDirection;
Pressione “Jogar” e pressione a tecla de seta para a esquerda enquanto se move para a direita: a cobra continua indo para a direita. Depois, pressione “Verificar”.
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;
}
}
Todas as lições de Jogo 3D da Cobrinha na Unity
Pratique por conta própria: Playground de Unity