Juan Castro
ProfesorSHORTCUT: CTRL | CMD + D para duplicar nuestros objetos seleccionados.
Una implementación sólida de recolección de monedas en Unity une tres piezas: la moneda, el Game Manager y la interfaz HUD. Aquí verás cómo comunicar objetos recolectables con el contador global y cómo reflejarlo en pantalla a 60 FPS, con código C# claro y buenas prácticas de prefabs y diseño de niveles.
¿Cómo se conectan moneda, game manager y hud?
Para que el flujo sea consistente, cada pieza asume una responsabilidad concreta con un hilo conductor simple: recolectar, contar y mostrar.
Ejemplo de la variable pública y el método en el Game Manager:
public class GameManager : MonoBehaviour { public static GameManager SharedInstance; // patrón de acceso compartido. public int collectedObjects = 0; // empieza en 0. public void CollectObject(Collectable collectable) { collectedObjects += collectable.value; // se incrementa con "+=". } }
Conexión desde la interfaz para pintar el conteo:
// En la GameView (HUD): coins = GameManager.SharedInstance.collectedObjects;
¿Qué hace collect object y por qué usar +=?
El método CollectObject encapsula la lógica de contar: recibe un recolectable y suma su valor al total. La sintaxis "+=" es clave para escribir código más claro y breve.
Llamada desde la moneda usando un switch por tipo:
public void Collect() { switch (collectableType) { case CollectableType.Money: GameManager.SharedInstance.CollectObject(this); break; case CollectableType.HealthPotion: // lógica futura para poción de vida. break; case CollectableType.ManaPotion: // lógica futura para poción de maná. break; } }
Claves prácticas que fortalecen tu implementación:
¿Cómo depurar, usar prefabs y diseñar niveles con monedas?
Más allá del código, la estabilidad depende de buenos hábitos de edición, pruebas y diseño.
¿Cómo evitar errores por cambios sin guardar?
¿Cómo validar el contador con pruebas rápidas?
¿Cómo aplicar cambios en prefabs y organizar la escena?
¿Cómo guiar al jugador con diseño de monedas?
Habilidades y conceptos reforzados en este flujo:
¿Te animas a mostrar tu propuesta? Comparte un screenshot de tu diseño de niveles y cuántas monedas logras recolectar sin morir. Si te atreves con monedas trampa, cuéntanos dónde las pusiste y qué buscabas provocar en el jugador.
Hola @Ervic, asi es como le hago yo para poner un gif en un aporte de Platzi:
 y pues ya con eso se ve el gif
Juan Castro
ProfesorSHORTCUT: CTRL | CMD + D para duplicar nuestros objetos seleccionados.
Julián David Romero Hernández
Marcela Dueñas
Hola , ese "itemCollectable" de donde viene
Samar Jaffal
Me encanta como va quedando con este curso.
Luis Rodrigo Alvarez Herrera
aqui una muestra de como va
Julio Armando Torres Minera
Perdí en mi propio juego :v
Franz Pool Nuñez Villazana
En el minuto 10:48 cuando el profesor come la moneda se le suman dos en el contador. ¿Porqué pasara esto?
Dino Pollece
Me está ocurriendo este que le ocurre al profe al minuto 10, no logro ver que es.
Pedro Muñoz Becerra
Es por el collider de los pies, ya que el player tiene 2 colliders, la moneda ejecuta el “ontriggerenter2d” 2 veces.
Como solución, utilicé la variable "hasBeenColleted"
void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Player")) { if (!hasBeenCollected) { Collect(); } } }
Thomas Antonio Contreras Lan
Actualizado con trampas, bounce materials, mini cámara y diversion con mas trampas de monedas 😈ç
https://drive.google.com/open?id=1f2ee8m9nL1XJ0IDN7E516kSTkew8Xgdx
:D
Juan Sebastian Avila
El super salto esta genial 😁
Maria Eugenia Alonso
asi va quedando mi juego
Wilmer David Cedeño Mendoza
Aquí dejo una captura de uno de mis niveles
felipe chaux gutierrez
Así va quedando el mio XDDDD
Tomas Leonardo Amaya Ríos

Respecto a la aparición de monedas he decidido añadirle unos cambios al script de LevelManager.cs para que estas aparezcan de forma aleatoria en cada bloque de nivel
private void GenerateCoins(Vector3 blockPosition) { int randomGen = Random.Range(1, 5); Vector3 spawnCoin = blockPosition; for (int i = 0; i < randomGen; i++) { Collectable coin = Instantiate(itemCollectable); spawnCoin = new Vector3( spawnCoin.x + Random.Range(5, 10), spawnCoin.y + Random.Range(-3, 3), 0 ); coin.transform.SetParent(this.transform, false); coin.transform.position = spawnCoin; if (spawnCoin.y > 10 || spawnCoin.y < -5) { spawnCoin.y = 0; } } } public void AddLevelBlock() { int randomIdx = Random.Range(0, allLevelBlocks.Count); LevelBlock block; Vector3 spawnPosition = Vector3.zero; if (currentLevelBlocks.Count == 0) { block = Instantiate(allLevelBlocks[0]); spawnPosition = levelStartPosition.position; } else { block = Instantiate(allLevelBlocks[randomIdx]); spawnPosition = currentLevelBlocks[currentLevelBlocks.Count - 1].exitPoint.position; } block.transform.SetParent(this.transform, false); Vector3 correction = new Vector3( spawnPosition.x - block.startPoint.position.x, spawnPosition.y - block.startPoint.position.y, 0 ); block.transform.position = correction; GenerateCoins(correction); currentLevelBlocks.Add(block); }