Menu
CoddyTech

Pas de demi-tour

Leçon 3 sur 14 du cours Jeu Unity : Snake 3D de Coddy.

Un serpent qui tourne directement en arrière se retrouve contre son propre cou, donc un virage dans la direction opposée à celle où il se déplace est ignoré. La direction opposée d’une direction est son opposé : pendant que le serpent se déplace vers la droite, -direction est Vector3.left.

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

Comparer avec direction ne suffit pas si une pression modifie immédiatement direction. En se déplaçant vers la droite, le joueur appuie sur haut puis sur gauche au cours d’un même tick. Haut est autorisé. Gauche est alors vérifié par rapport à haut, le virage qui n’a pas encore eu lieu, et est également autorisé, si bien que le pas suivant va vers la gauche, directement en arrière, par-dessus le cou.

La solution consiste à conserver deux directions. direction est la direction dans laquelle la tête s’est déplacée lors de son dernier pas ; nextDirection est le virage en attente pour le pas suivant. Une touche modifie nextDirection, mais seulement après avoir comparé le virage avec direction, et le pas commence par appliquer le virage en attente. Dans le cas ci-dessus, gauche est comparé à droite, la direction réelle du déplacement de la tête, et le virage est rejeté.

challenge icon

Défi

Facile
  1. Ajoute private Vector3 nextDirection = Vector3.right;, le virage en attente du prochain déplacement.
  2. Écris void Turn(Vector3 newDirection) : cette méthode définit nextDirection sur newDirection, sauf si newDirection est l’opposé de direction.
  3. Dans Update(), chaque touche appelle Turn avec sa direction au lieu de définir direction.
  4. Au début de Step(), définis direction sur nextDirection.

Appuie sur Play et essaie de faire demi-tour, puis appuie sur Check.

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;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Unity : Snake 3D