Menu
CoddyTech

Déplacer la route

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

Dans un jeu de course sans fin, le joueur reste en place et le monde vient à lui. Faire avancer la caméra et le joueur indéfiniment fonctionnerait aussi, mais les nombres augmenteraient sans fin ; déplacer la route garde tout près de zéro.

La vitesse concerne tout le jeu, elle se trouve donc dans GameManager. La route la récupère une fois dans Start et lit sa valeur à chaque image :

float step = game.speed * Time.deltaTime;
foreach (Transform chunk in chunks)
{
    chunk.position += Vector3.back * step;
}

Vector3.back vaut (0, 0, -1) : vers la caméra. Pour déplacer les morceaux plus tard, la route doit les garder en mémoire, dans une List<Transform>.

challenge icon

Défi

Facile
  1. Dans GameManager, ajoute public float startSpeed = 10f; et public float speed;, puis définis speed = startSpeed dans Start.
  2. Dans Road, ajoute private List<Transform> chunks = new List<Transform>(); (avec using System.Collections.Generic;) et private GameManager game;.
  3. Dans Start, définis game = FindFirstObjectByType<GameManager>(); et ajoute chaque nouveau morceau à chunks.
  4. Écris Update comme ci-dessus.

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