Menu
CoddyTech

Deslizarse

Lección 4 de 20 del curso Juego de Unity: Carriles celestes de Coddy.

Algunos obstáculos cuelgan demasiado alto para saltarlos: el corredor se desliza por debajo. Durante un instante, al deslizarse, el corredor queda con la mitad de su altura.

Al reducir el tamaño del objeto, también se reduce su CharacterController, pero se reduce alrededor del centro, así que los pies quedarían flotando medio unidad por encima de la carretera. Baja al corredor esa misma media unidad. El controlador debe estar desactivado mientras lo mueves manualmente, o su siguiente Move deshace el cambio:

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 temporizador, slide, cuenta el tiempo que dura el deslizamiento. Cuando se agota, el corredor vuelve a ponerse de pie con StopSlide:

void StopSlide()
{
    if (transform.localScale.y < 1f) Resize(1f);
    slide = 0f;
}
challenge icon

Desafío

Fácil
  1. Añade public float slideTime = 0.7f; y private float slide;.
  2. Añade Resize y StopSlide como se indicó arriba.
  3. Cuando se pulse S o la flecha hacia abajo mientras el personaje está en el suelo, asigna slide = slideTime y llama a Resize(0.5f).
  4. En cada fotograma, si slide > 0f, réstale Time.deltaTime y llama a StopSlide() cuando llegue a 0.
  5. Un salto termina el deslizamiento: llama a StopSlide() cuando el personaje salte.

Pruébalo tú mismo

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);
    }
}

Todas las lecciones de Juego de Unity: Carriles celestes

Practica por tu cuenta: Playground de Unity