Demi-tours interdits
Leçon 3 sur 14 du cours Jeu Unity : Snake 3D de Coddy.
Un serpent qui fait immédiatement demi-tour se heurte à son propre cou : un virage dans la direction opposée est donc ignoré. La direction opposée est son négatif : lorsque le serpent se déplace vers la droite, -direction est Vector3.left.
Comparer avec direction ne suffit pas si une pression la modifie immédiatement : le serpent se déplace vers la droite, un joueur appuie sur la touche haut, puis sur la touche gauche, pendant un seul tick. Le virage vers le haut est autorisé, puis le virage vers la gauche est comparé à celui vers le haut et est lui aussi autorisé ; à l’étape suivante, le serpent repasse par-dessus son cou.
Il faut donc conserver deux directions : direction, celle dans laquelle la tête s’est déplacée en dernier, et nextDirection, le virage en attente de la prochaine étape. Une touche modifie nextDirection après comparaison avec direction, et l’étape rend effectif le virage en attente.
Défi
FacileEmpêchez le serpent de faire demi-tour et de se retourner directement sur son cou.
- Ajoutez
private Vector3 nextDirection = Vector3.right;etvoid Turn(Vector3 newDirection): définissez nextDirection sauf sinewDirection == -direction. - Dans
Update(), chaque touche appelleTurnavec sa direction au lieu de définir direction. - Au début de
Step(), définissezdirection = nextDirection;
Cliquez sur « Jouer » et appuyez sur la flèche gauche pendant que le serpent se déplace vers la droite : il continue d’aller vers la droite. Puis cliquez sur « Vérifier ».
Essayez vous-même
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // secondes entre deux déplacements
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;
}
}
Toutes les leçons de Jeu Unity : Snake 3D
Entraînez-vous par vous-même : Playground Unity