Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Faites avancer le joueur avec les flèches par rapport à la caméra qui tourne.

  1. Dans Update(), copiez cam.forward et cam.right, avec y à 0, puis normalisez-les.
  2. dir est égal à forward multiplié par l’axe brut "Vertical", plus right multiplié par "Horizontal", puis normalisé lorsqu’il est supérieur à 1.
  3. Lorsque dir != Vector3.zero, définissez transform.rotation = Quaternion.LookRotation(dir);. Construisez move à partir de dir * 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

Entraînez-vous par vous-même : Playground Unity