Menu
CoddyTech

Recicla el camino

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

Siete piezas son 140 unidades de carretera. A 10 unidades por segundo, se acaba en 14 segundos. Crear una pieza nueva cada vez que se necesita y destruir las antiguas funcionaría, pero hay una forma más económica: una pieza que ha pasado por detrás del corredor se mueve al frente y se vuelve a usar.

Una pieza queda completamente detrás cuando su centro pasa de -chunkLength. Hay siete piezas seguidas, así que moverla siete longitudes la coloca justo después de la última:

if (chunk.position.z < -chunkLength)
{
    chunk.position += Vector3.forward * chunkLength * chunks.Count;
}

Reutilizar objetos en lugar de destruirlos y crear otros nuevos se llama agrupación de objetos. Siete piezas forman una carretera infinita.

challenge icon

Desafío

Fácil
  1. En Road.Update, después de que un tramo se mueva, muévelo al frente una vez que haya quedado completamente detrás, como se indicó anteriormente.

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 float slideTime = 0.7f;

    public int lane;

    private CharacterController controller;
    private float fallSpeed;
    private float slide;

    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);
            StopSlide();
        }
        if ((Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.DownArrow)) && controller.isGrounded)
        {
            slide = slideTime;
            Resize(0.5f);
        }

        if (slide > 0f)
        {
            slide -= Time.deltaTime;
            if (slide <= 0f) StopSlide();
        }

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

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

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

Todas las lecciones de Juego de Unity: Carriles celestes

Practica por tu cuenta: Playground de Unity