Glisser
Leçon 4 sur 20 du cours Jeu Unity : Voies célestes de Coddy.
Certains obstacles sont suspendus trop haut pour qu’on puisse sauter par-dessus : le coureur glisse dessous. Pendant un instant, le coureur fait la moitié de sa taille lorsqu’il glisse.
Réduire la taille de l’objet réduit aussi celle de son CharacterController, mais la réduction se fait autour du milieu : les pieds flotteraient donc à une demi-unité au-dessus de la route. Abaisse le coureur de cette même demi-unité. Un contrôleur doit être désactivé pendant que tu le déplaces manuellement, sinon son prochain Move annule le changement :
void Resize(float height)
{
controller.enabled = false;
transform.position += Vector3.up * (height - transform.localScale.y);
transform.localScale = new Vector3(1f, height, 1f);
controller.enabled = true;
}Un minuteur, slide, décompte la glissade. Lorsqu’il arrive à zéro, le coureur se redresse avec StopSlide :
void StopSlide()
{
if (transform.localScale.y < 1f) Resize(1f);
slide = 0f;
}Défi
Facile- Ajoutez
public float slideTime = 0.7f;etprivate float slide;. - Ajoutez
ResizeetStopSlidecomme ci-dessus. - Lorsque vous appuyez sur S ou sur la flèche vers le bas au sol, définissez
slide = slideTimeet appelezResize(0.5f). - À chaque image, si
slide > 0f, soustrayez-luiTime.deltaTimeet appelezStopSlide()dès qu’il atteint 0. - Un saut met fin à une glissade : appelez
StopSlide()lorsque le coureur saute.
Essayez vous-même
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public float laneSpeed = 16f;
public float jumpHeight = 1.6f;
public float gravity = -40f;
public int lane;
private CharacterController controller;
private float fallSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
if (jump && controller.isGrounded)
{
fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
fallSpeed += gravity * Time.deltaTime;
float targetX = lane * laneWidth;
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
controller.Move(move);
}
}
Toutes les leçons de Jeu Unity : Voies célestes
Entraînez-vous par vous-même : Playground Unity