Des rangées plus animées
Leçon 12 sur 20 du cours Jeu Unity : Voies célestes de Coddy.
Un obstacle par rangée, c’est facile : les deux autres voies sont toujours libres. Plus tard dans la partie, les rangées devraient en contenir deux ou trois. made compte déjà les pièces, il peut donc déterminer combien d’obstacles une rangée peut contenir :
int busy = Mathf.Min(3, 1 + made / 12);
int count = Random.Range(1, busy + 1);Deux obstacles ne doivent pas se trouver dans la même voie. Garde les voies libres dans une liste et retire chacune une fois qu’elle est utilisée. Et trois murs d’affilée ne laisseraient aucun passage, alors avec deux murs, choisis plutôt une barrière ou une barre.
List<int> lanes = new List<int> { -1, 0, 1 };
int pick = Random.Range(0, lanes.Count);
int lane = lanes[pick];
lanes.RemoveAt(pick);Défi
Moyen- Dans
Fill, déterminebusyetcountcomme ci-dessus. - Place
countobstacles, chacun dans une voie retirée delanes. - Compte les murs ; lorsque
kind == 2et qu’il y en a déjà deux, choisis plutôtRandom.Range(0, 2).
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 GameManager game;
private float fallSpeed;
private float slide;
void Start()
{
controller = GetComponent<CharacterController>();
game = FindFirstObjectByType<GameManager>();
}
void Update()
{
if (!game.over)
{
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;
}
void OnTriggerEnter(Collider other)
{
if (game.over) return;
if (other.CompareTag("Obstacle"))
{
game.GameOver();
}
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Jeu Unity : Voies célestes
Entraînez-vous par vous-même : Playground Unity