Menu
CoddyTech

Monedas

Lección 13 de 20 del curso Juego de Unity: Carriles celestes de Coddy.

Las monedas le dan al jugador un motivo para cambiar de carril cuando no hay nada en el camino. Cada pieza tiene una fila de cuatro monedas en un carril, después de sus obstáculos, en las posiciones 4, 7, 10 y 13 a lo largo de la pieza, y en y 1.

Una moneda gira por sí sola, con su propio script:

void Update()
{
    transform.Rotate(0f, 0f, spinSpeed * Time.deltaTime);
}

El prefab de la moneda está tumbado de lado, así que su propio eje z apunta hacia arriba: girar alrededor de z la hace girar como una moneda sobre una mesa.

Recogerla es tarea de Runner, en el mismo OnTriggerEnter: una moneda suma uno mediante game.AddCoin() y se destruye.

challenge icon

Desafío

Fácil
  1. En Coin, añade public float spinSpeed = 180f; y el Update de arriba.
  2. En Road, añade coinPrefab y, al final de Fill, coloca 4 monedas en un carril aleatorio en z 4f + i * 3f.
  3. En GameManager, añade public TMP_Text coinText;, public int coins; y public void AddCoin() (una moneda más y después ShowScore()). ShowScore también asigna coinText.text = "Coins: " + coins;.
  4. En Runner.OnTriggerEnter, else if (other.CompareTag("Coin")): añade la moneda y destrúyela.

Pruébalo tú mismo

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 las lecciones de Juego de Unity: Carriles celestes

Practica por tu cuenta: Playground de Unity