Menu
CoddyTech

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.

challenge icon

Desafio

Fácil
  1. Em Coin, adicione public float spinSpeed = 180f; e o Update acima.
  2. Em Road, adicione coinPrefab e, no final de Fill, coloque 4 moedas em uma faixa aleatória no z 4f + i * 3f.
  3. Em GameManager, adicione public TMP_Text coinText;, public int coins; e public void AddCoin() (mais uma moeda e, em seguida, ShowScore()). ShowScore também define coinText.text = "Coins: " + coins;.
  4. 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