Menu
CoddyTech

Monter sur la plateforme

Fait partie de la section Créer de vrais jeux du Journey Unity de Coddy. Leçon 51 sur 60.

Un CharacterController n’est pas transporté par ce sur quoi il se tient : sur une plateforme mobile, il reste immobile tandis que la plateforme glisse sous lui. Modifier son transform.position n’aide pas, car le prochain Move démarre de l’endroit où la physique l’a vu pour la dernière fois et annule la modification.

Le joueur ajoute donc le déplacement de la plateforme au sien. OnControllerColliderHit(ControllerColliderHit hit) s’exécute pour chaque collider touché par un Move ; un contact par-dessous a un hit.normal.y proche de 1. Un bac qui transporte une caisse de la même manière :

private Ferry ferry;

void OnControllerColliderHit(ControllerColliderHit hit)
{
    if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
    {
        ferry = f;
    }
}
challenge icon

Défi

Moyen

Fais monter le joueur sur la plateforme mobile.

  1. Dans Player, ajoute private MovingPlatform platform; et OnControllerColliderHit : lorsque hit.normal.y > 0.5f et que l’objet possède un MovingPlatform, conserve-le dans platform.
  2. Dans Update(), place (move + velocity) * Time.deltaTime dans Vector3 motion. Si platform != null, ajoute platform.delta et définis platform = null.
  3. Appelle controller.Move(motion).

Appuie sur « Jouer » et saute sur la plateforme : elle t’emporte. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private InputAction moveAction;
    private InputAction jumpAction;
    private Vector3 velocity;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
        jumpAction = InputSystem.actions.FindAction("Jump");
    }

    void Update()
    {
        if (controller.isGrounded && velocity.y < 0f)
        {
            velocity.y = -2f;
        }

        Vector2 input = moveAction.ReadValue<Vector2>();
        Vector3 move = new Vector3(input.x, 0f, input.y) * speed;

        if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
        {
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
        }

        velocity.y += gravity * Time.deltaTime;
        controller.Move((move + velocity) * Time.deltaTime);
    }
}

Toutes les leçons de Créer de vrais jeux

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