Menu
CoddyTech

Construye el camino

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

Hasta ahora, el corredor estaba sobre un bloque plano llamado Ground. A partir de aquí, el script Road construye la carretera y el bloque desaparece.

La carretera está hecha de piezas de 20 unidades de largo, colocadas una tras otra. Una pieza es un GameObject vacío llamado Chunk, y todo lo que hay en esa pieza es su hijo: el suelo, las líneas discontinuas entre los carriles y los dos bordes. Al mover la pieza, se moverá todo lo que contiene.

Transform chunk = new GameObject("Chunk").transform;
chunk.position = new Vector3(0f, 0f, i * chunkLength);
Instantiate(floorPrefab, chunk.position + new Vector3(0f, -0.25f, 0f), Quaternion.identity, chunk);

El último argumento de Instantiate es el padre. El suelo tiene medio unidad de grosor, así que su centro queda un cuarto de unidad por debajo de la superficie de la carretera, en y 0.

Las líneas de cada carril constan de cuatro segmentos discontinuos, de 3 unidades de largo y separados por 5 unidades, en x -laneWidth / 2f y laneWidth / 2f. Los bordes están en x -4.1 y 4.1, y 0.05.

challenge icon

Desafío

Fácil
  1. En Road, añade los campos de prefabs floorPrefab, stripePrefab y edgePrefab (todos public GameObject), y chunkCount = 7, chunkLength = 20f, laneWidth = 2.5f. El Inspector rellena los prefabs.
  2. En Start, crea chunkCount piezas, con la pieza i en z i * chunkLength, cada una con su suelo.
  3. En cada pieza, para d desde 0 hasta 3, coloca dos marcas en z -7.5f + d * 5f, y 0.01, una en cada línea de carril.
  4. Coloca los dos bordes.

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