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.
Desafío
Fácil- En
Coin, añadepublic float spinSpeed = 180f;y elUpdatede arriba. - En
Road, añadecoinPrefaby, al final deFill, coloca 4 monedas en un carril aleatorio en z4f + i * 3f. - En
GameManager, añadepublic TMP_Text coinText;,public int coins;ypublic void AddCoin()(una moneda más y despuésShowScore()).ShowScoretambién asignacoinText.text = "Coins: " + coins;. - 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