Menu
CoddyTech

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.

challenge icon

Défi

Facile

Empêchez le serpent de faire demi-tour et de se retourner directement sur son cou.

  1. Ajoutez private Vector3 nextDirection = Vector3.right; et void Turn(Vector3 newDirection) : définissez nextDirection sauf si newDirection == -direction.
  2. Dans Update(), chaque touche appelle Turn avec sa direction au lieu de définir direction.
  3. Au début de Step(), définissez direction = 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