Moedas
Lição 13 de 20 do curso Jogo Unity: Pistas no Céu da Coddy.
As moedas dão ao jogador um motivo para mudar de faixa quando não há nada no caminho. Cada trecho recebe uma fileira de quatro moedas em uma faixa, depois dos obstáculos, nas posições 4, 7, 10 e 13 ao longo do trecho, e em y 1.
Uma moeda gira sozinha, com seu próprio script:
void Update()
{
transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime);
}O prefab da moeda fica de lado, então seu próprio eixo z aponta para cima: girar em torno de z faz com que ela gire como uma moeda sobre uma mesa.
Coletar moedas é tarefa do corredor, no mesmo OnTriggerEnter: uma moeda adiciona uma unidade por meio de game.AddCoin() e é destruída.
Desafio
Fácil- Em
Coin, adicionepublic float spinSpeed = 180f;e o Update acima. - Em
Road, adicionecoinPrefabe, no final deFill, coloque 4 moedas em uma faixa aleatória no z4f + i * 3f. - Em
GameManager, adicionepublic TMP_Text coinText;,public int coins;epublic void AddCoin()(mais uma moeda e, em seguida,ShowScore()). ShowScore também definecoinText.text = "Coins: " + coins;. - Em
Runner.OnTriggerEnter,else if (other.CompareTag("Coin")): adicione a moeda e destrua-a.
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();
}
}
}
Todas as lições de Jogo Unity: Pistas no Céu
Pratique por conta própria: Playground de Unity