Fileiras mais movimentadas
Lição 12 de 20 do curso Jogo Unity: Pistas no Céu da Coddy.
É fácil colocar um obstáculo em uma fileira: as outras duas faixas estão sempre livres. Mais adiante na partida, as fileiras devem ter dois ou três obstáculos. made já conta as peças, então pode definir quantos obstáculos uma fileira pode ter:
int busy = Mathf.Min(3, 1 + made / 12);
int count = Random.Range(1, busy + 1);Dois obstáculos não podem ocupar a mesma faixa. Mantenha as faixas livres em uma lista e remova cada uma dela depois de usá-la. E três barreiras seguidas não deixariam nenhum caminho livre, então, quando houver duas barreiras, escolha uma barreira baixa ou uma barra.
List<int> lanes = new List<int> { -1, 0, 1 };
int pick = Random.Range(0, lanes.Count);
int lane = lanes[pick];
lanes.RemoveAt(pick);Desafio
Médio- Em
Fill, calculebusyecountcomo acima. - Posicione
countobstáculos, cada um em uma faixa removida delanes. - Conte as paredes; quando
kind == 2e já houver duas, escolhaRandom.Range(0, 2)em vez disso.
Experimente você mesmo
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();
}
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Jogo Unity: Pistas no Céu
Pratique por conta própria: Playground de Unity