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; // trueComparer 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é.
Défi
Facile- Ajoute
private Vector3 nextDirection = Vector3.right;, le virage en attente du prochain déplacement. - Écris
void Turn(Vector3 newDirection): cette méthode définitnextDirectionsurnewDirection, sauf sinewDirectionest l’opposé dedirection. - Dans
Update(), chaque touche appelleTurnavec sa direction au lieu de définirdirection. - Au début de
Step(), définisdirectionsurnextDirection.
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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.