Avancer dans la direction du regard
Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 42 sur 60.
Lorsque la caméra regarde le joueur sous un angle, les flèches doivent déplacer le joueur comme l’écran le montre : la flèche vers le haut le fait s’éloigner de la caméra, et la flèche vers la droite le fait avancer vers la droite de la caméra. Les axes du monde ne donnent ce résultat que lorsque la caméra regarde dans la direction +z. Construis donc le déplacement à partir des directions propres à la caméra, cam.forward et cam.right.
Il faut d’abord les nettoyer. Une caméra qui regarde le joueur vers le bas a un forward qui pointe vers le sol ; définis donc son y à 0 pour ne garder que la composante parallèle au sol. Le vecteur obtenu est plus court que 1, environ 0,87 pour une caméra inclinée de 30 degrés vers le bas, et le joueur marcherait donc plus lentement : normalise-le. Ce personnage se déplace en suivant la caméra principale, qui regarde un coin du niveau :
Transform cam = Camera.main.transform;
Vector3 forward = cam.forward;
forward.y = 0f;
forward.Normalize();
Vector3 right = cam.right;
right.y = 0f;
right.Normalize();
Vector3 move = forward * Input.GetAxisRaw("Vertical") + right * Input.GetAxisRaw("Horizontal");
if (move.magnitude > 1f) move.Normalize(); // les déplacements en diagonale ne sont pas plus rapides
controller.Move(move * speed * Time.deltaTime);Camera.main est la caméra portant le tag MainCamera. Les deux directions sont lues à chaque image, afin que les commandes restent correctes lorsque la caméra tourne. Les directions haut et droite, combinées, donnent deux vecteurs unitaires perpendiculaires, dont la longueur est d’environ 1,41 ; le déplacement est donc normalisé lorsque sa longueur dépasse 1.
Défi
MoyenFaites avancer le joueur avec les flèches par rapport à la caméra qui tourne.
- Dans
Update(), copiezcam.forwardetcam.right, avecyà 0, puis normalisez-les. direst égal àforwardmultiplié par l’axe brut"Vertical", plusrightmultiplié par"Horizontal", puis normalisé lorsqu’il est supérieur à 1.- Lorsque
dir != Vector3.zero, définisseztransform.rotation = Quaternion.LookRotation(dir);. Construisezmoveà partir dedir * speed.
Appuyez sur « Jouer » : la flèche vers le haut fait avancer le joueur en s’éloignant de la caméra, quelle que soit la direction vers laquelle elle regarde. Puis cliquez sur « Vérifier ».
Essayez vous-même
using UnityEngine;
public class Mover : MonoBehaviour
{
public float speed = 4f;
public float gravity = -15f;
public Transform cam;
CharacterController controller;
float verticalSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (controller.isGrounded && verticalSpeed < 0f)
{
verticalSpeed = -2f;
}
verticalSpeed += gravity * Time.deltaTime;
// Se déplace selon les axes du monde : fais-le se déplacer par rapport à cam et s'orienter dans la direction de son déplacement
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
move.y = verticalSpeed;
controller.Move(move * Time.deltaTime);
}
}
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 niveau2Boutons 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 sautEntraînez-vous par vous-même : Playground Unity