Menu
CoddyTech

Construire la route

Leçon 5 sur 20 du cours Jeu Unity : Voies célestes de Coddy.

Jusqu’à présent, le runner se tenait sur un bloc ordinaire nommé Ground. À partir de maintenant, le script Road construit la route, et le bloc a disparu.

La route est composée de morceaux de 20 unités de long, placés les uns après les autres. Un morceau est un GameObject vide nommé Chunk, et tout ce qui se trouve sur ce morceau en est un enfant : le sol, les pointillés entre les voies et les deux bords. Déplacer le morceau déplacera tout ce qu’il contient.

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

Le dernier argument de Instantiate est le parent. Le sol fait une demi-unité d’épaisseur, donc son milieu se trouve un quart d’unité sous la surface de la route, à y 0.

Chaque ligne de voie est composée de quatre pointillés de 3 unités de long, espacés de 5 unités, aux positions x -laneWidth / 2f et laneWidth / 2f. Les bords se trouvent aux positions x -4.1 et 4.1, y 0.05.

challenge icon

Défi

Facile
  1. Dans Road, ajoute les champs de prefab floorPrefab, stripePrefab et edgePrefab (tous de type public GameObject), ainsi que chunkCount = 7, chunkLength = 20f et laneWidth = 2.5f. L’Inspector renseigne les prefabs.
  2. Dans Start, crée chunkCount tronçons, le tronçon i à la coordonnée z i * chunkLength, chacun avec son sol.
  3. Sur chaque tronçon, pour d allant de 0 à 3, place deux tirets à la coordonnée z -7.5f + d * 5f, y 0.01, un sur chaque ligne de voie.
  4. Place les deux bordures.

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

Toutes les leçons de Jeu Unity : Voies célestes

Entraînez-vous par vous-même : Playground Unity