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;
}
}Défi
MoyenFais monter le joueur sur la plateforme mobile.
- Dans
Player, ajouteprivate MovingPlatform platform;etOnControllerColliderHit: lorsquehit.normal.y > 0.5fet que l’objet possède unMovingPlatform, conserve-le dansplatform. - Dans
Update(), place(move + velocity) * Time.deltaTimedansVector3 motion. Siplatform != null, ajouteplatform.deltaet définisplatform = null. - 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
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 : plateforme 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 banqueEntraînez-vous par vous-même : Playground Unity