CharacterController.Move
Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 37 sur 56.
Un CharacterController est le composant de Unity destiné à un personnage qui marche : une capsule qui se déplace uniquement lorsque votre script appelle controller.Move(motion). motion est la distance à parcourir pendant cette image ; elle correspond donc à une vitesse multipliée par Time.deltaTime. Move fait glisser la capsule le long des murs au lieu de la faire passer à travers, lui permet de monter les pentes jusqu’à sa limite de pente (45 degrés) et de franchir les rebords jusqu’à son décalage de marche (0.3 unité). Ce n’est pas un Rigidbody : pas de forces, pas de gravité, pas de rebond, et rien ne le pousse. Il va exactement là où Move l’envoie, ce dont les commandes précises d’un jeu ont besoin.
C’est à vous d’ajouter la gravité et de détecter le sol. isGrounded vaut true lorsque le dernier Move a touché quelque chose en dessous ; un déplacement sans composante vers le bas ne détecte donc jamais le sol. Un Move inférieur à la distance minimale de déplacement du contrôleur (0.001) ne fait absolument rien. Ainsi, un contrôleur déplacé uniquement sur le côté indique qu’il n’est pas au sol dès qu’il s’immobilise. Ce coursier se déplace avec les flèches et appuie légèrement vers le bas à chaque déplacement :
public class Courier : MonoBehaviour
{
public float speed = 6f;
CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = -2f; // exercer toujours une pression vers le bas pour détecter le sol
controller.Move(move * Time.deltaTime);
if (!controller.isGrounded)
{
Debug.Log("Off the ground");
}
}
}La capsule reste à distance de sa largeur de peau (0.08) de ce qu’elle touche. Ainsi, un contrôleur de 2 unités de haut posé sur un sol à y = 0 se trouve à y = 1.08, et non à 1. Et Move part de l’endroit où la physique a vu le contrôleur pour la dernière fois : une valeur affectée à transform.position peut donc être annulée par son prochain Move. Pour le téléporter, définissez controller.enabled = false, déplacez-le, puis réactivez-le.
Défi
MoyenL’explorateur se tient sur une plateforme en pierre, avec un mur derrière lui et un précipice à gauche. Écrivez Explorer.cs sur le Player, qui possède un CharacterController. Dans l’Inspector, définissez speed (4) et fallSpeed (3), et Start() trouve déjà le contrôleur et le Renderer de l’explorateur.
- Les flèches (ou WASD), lues avec les axes bruts, le font se déplacer à
speedunités par seconde : à gauche et à droite selon x, vers le haut et vers le bas selon z. Le mur doit l’arrêter. - Chaque déplacement va aussi vers le bas à
fallSpeedunités par seconde, afin que l’explorateur reste sur la plateforme et tombe lorsqu’il en atteint le bord. - Lorsque le contrôleur est au sol, l’explorateur est
Color.green; sinon, il estColor.red.
Appuyez sur Play, avancez jusqu’au mur puis tombez du bord, et enfin cliquez sur Check.
Essayez vous-même
using UnityEngine;
public class Explorer : MonoBehaviour
{
public float speed = 4f;
public float fallSpeed = 3f;
CharacterController controller;
Renderer rend;
void Start()
{
controller = GetComponent<CharacterController>();
rend = GetComponent<Renderer>();
}
void Update()
{
// Déplace l'explorateur avec controller.Move, puis colore-le selon isGrounded
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Créer de vrais jeux
1Texte à l’écran
Canvas et texteAfficher le scoreFormater les nombresUn compte à reboursRécapitulatif : compteur de vitesse4Scènes et niveaux
Charger une scèneRedémarrer le niveauNiveau suivantConserver entre les scènesRécapitulatif : sélection du niveau7Contrôle du temps
Mettre en pause avec timeScaleRalentiTemps non mis à l’échelleRécapitulatif : Bullet Time10Projet : jeu de plateforme en 3D
Le parcoursPlateformes mobiles2Boutons et écrans
Boutons et onClickLambdasRelier les éléments dans l’InspectorActiver et désactiver les panneauxBarres de santéRécapitulatif : boutique d’améliorations5Sauvegarder avec PlayerPrefs
Enregistrer un nombreCharger avec une valeur par défautMeilleur scoreEnregistrer les paramètresRécapitulatif : les pièces à la banque8Contrôleur de personnage
CharacterController.MoveGravité manuelleSauterPousser des objetsAvancer dans la direction du regardRécapitulatif : double saut