Café y Código

3. Colisiones y Triggers: Interacción Física en el Juego 💥🪙

Diferencia Crucial: Collider vs. Trigger

Para que dos objetos interactúen físicamente en Unity, ambos deben poseer un componente derivado de Collider (Box Collider, Sphere Collider, Capsule Collider, etc.). Existen dos formas de configurar estos colisionadores:

  • Collider Sólido (Is Trigger desactivado): Actúa como un muro impenetrable. Cuando el jugador choca contra él, rebota física y automáticamente debido a la masa y fuerzas calculadas en el Rigidbody.
  • Trigger (Is Trigger activado): Funciona como una zona de detección o sensor invisible. El jugador puede atravesarlo libremente sin sentir resistencia, pero el motor de Unity nos avisará mediante código cuando el jugador entre, permanezca o salga de esa zona. Es ideal para coleccionables, llaves, portales de meta o trampas de lava.

1. Animando las Monedas (Rotación Continua)

Para que nuestras monedas parezcan vivas y atraigan la atención del jugador, haremos que roten continuamente en el espacio.

  1. Crea un script llamado RotateCoin en tu carpeta de activos.
  2. Reemplaza su código por el siguiente:
RotateCoin.cs
CSHARP
1 using UnityEngine;
2
3 public class RotateCoin : MonoBehaviour
4 {
5 [SerializeField] private Vector3 rotationSpeed = new Vector3(0, 100, 0);
6
7 void Update()
8 {
9 // Rota el objeto sobre su propio eje de forma suave e independiente de los FPS
10 transform.Rotate(rotationSpeed * Time.deltaTime);
11 }
12 }
  1. Arrastra este script sobre tu objeto Coin.
  2. En el Inspector del objeto Coin, asegúrate de activar la casilla Is Trigger en su componente Box Collider o Sphere Collider.
  3. Asigna el Tag "Coin" al objeto en la parte superior del Inspector (si no existe, haz clic en Add Tag para crearlo).

2. Programando la Recolección (Triggers)

Abriremos nuestro script PlayerController.cs y agregaremos el método nativo OnTriggerEnter de Unity para detectar cuándo el jugador pasa por encima de la moneda:

PlayerController.cs (Fragmento Trigger)
CSHARP
1 // Agrega esto dentro de la clase PlayerController.cs
2
3 // OnTriggerEnter se ejecuta cuando cruzamos un objeto marcado como "Is Trigger"
4 private void OnTriggerEnter(Collider other)
5 {
6 // Comparamos si el objeto que atravesamos tiene la etiqueta "Coin"
7 if (other.CompareTag("Coin"))
8 {
9 // Desactivamos la moneda para que desaparezca de la escena
10 other.gameObject.SetActive(false);
11
12 // Opcional: Mostrar mensaje en la consola de depuracion
13 Debug.Log("¡Moneda recolectada!");
14 }
15 }

¿Cómo funciona? Cuando la esfera del jugador entra en la zona del colisionador de la moneda, Unity invoca automáticamente a OnTriggerEnter y nos pasa los datos de ese colisionador (other). Si el tag del objeto es "Coin", lo desactivamos y desaparece visualmente del escenario.

3. Detectando Impactos con Obstáculos (Colisiones)

Para los obstáculos sólidos (muros o cilindros de peligro), queremos que bloqueen el paso pero que el código se entere del golpe para poder restar vidas o reiniciar. Agregaremos el método OnCollisionEnter al script del jugador:

PlayerController.cs (Fragmento Collision)
CSHARP
1 // Agrega esto dentro de la clase PlayerController.cs
2
3 // OnCollisionEnter se ejecuta al impactar fisicamente contra un objeto solido
4 private void OnCollisionEnter(Collision collision)
5 {
6 // Comparamos si chocamos contra un obstaculo peligroso
7 if (collision.gameObject.CompareTag("Obstacle"))
8 {
9 Debug.Log("¡Ay! Chocamos contra un obstaculo.");
10
11 // Aqui mas adelante agregaremos logica para restar vida o reiniciar el nivel
12 }
13 }
  1. Selecciona tu cilindro u obstáculo en la jerarquía.
  2. En la parte superior del Inspector, cámbiale el Tag a "Obstacle" (créalo si no está en la lista).
  3. Asegúrate de que la casilla Is Trigger esté desactivada para que actúe como un muro físico.

4. Creando Obstáculos Móviles (Patrones de Movimiento)

Un prototipo se vuelve más divertido si añadimos movimiento a los peligros. Programaremos un obstáculo que patrulle de un lado a otro sobre la arena de juego:

  1. Crea un script llamado ObstacleMovement.
  2. Reemplaza el código por el siguiente:
ObstacleMovement.cs
CSHARP
1 using UnityEngine;
2
3 public class ObstacleMovement : MonoBehaviour
4 {
5 [SerializeField] private float speed = 3f;
6 [SerializeField] private float distance = 5f;
7
8 private Vector3 startPosition;
9
10 void Start()
11 {
12 // Guardamos la posicion de origen del obstaculo
13 startPosition = transform.position;
14 }
15
16 void Update()
17 {
18 // Calculamos una posicion de vaiven (Ping-Pong) sobre el eje X
19 float movementX = Mathf.PingPong(Time.time * speed, distance);
20
21 // Aplicamos la nueva posicion sumando el desplazamiento a la posicion inicial
22 transform.position = new Vector3(startPosition.x + movementX, startPosition.y, startPosition.z);
23 }
24 }

Explicación: Mathf.PingPong(tiempo, distancia) genera un valor oscilante que sube y baja constantemente como un péndulo. Al sumarlo a la posición inicial, el cilindro se moverá de izquierda a derecha automáticamente.

Ponte a prueba

Comprueba si comprendes la diferencia entre las físicas de colisión sólida y el registro de sensores trigger.

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.
🎮 CONSOLA DE SKIN
Comandos: matrix, minecraft, pacman, default
>