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.
Défi
Facile- Dans
Road, ajoute les champs de prefabfloorPrefab,stripePrefabetedgePrefab(tous de typepublic GameObject), ainsi quechunkCount = 7,chunkLength = 20fetlaneWidth = 2.5f. L’Inspector renseigne les prefabs. - Dans
Start, créechunkCounttronçons, le tronçonià la coordonnée zi * chunkLength, chacun avec son sol. - 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. - 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