Capítulo 4: ¡Haciendo Reaccionar a Nuestros Objetos – Introducción a los Materiales y el Renderer!
En el capítulo anterior, aprendimos a detectar cuándo nuestro cubo colisiona con el plano utilizando Colliders y el script OnCollisionEnter(). Ahora, vamos a hacer que esta colisión tenga un efecto visual, cambiando el color del plano cuando el cubo lo toque. Para esto, trabajaremos con Materiales y el Renderer de nuestros GameObjects.
Paso 1: Creando un Nuevo Material
Un Material define cómo se renderiza un objeto en la pantalla, incluyendo su color, textura, brillo y más. Vamos a crear un nuevo Material para nuestro plano.
- Ve a la ventana de Proyecto.
- Haz clic derecho en cualquier espacio vacío, selecciona “Crear” y luego haz clic en “Material“.
- Se creará un nuevo Material con el nombre predeterminado de “New Material“. Cámbiale el nombre a “MaterialPlanoImpactado”.
- Selecciona el Material “MaterialPlanoImpactado” en la ventana de Proyecto.
- En la ventana de Inspector, verás las propiedades del Material. Haz clic en el cuadro de color al lado de “Albedo” (que controla el color base del material) y elige un color llamativo, como el rojo.
Paso 2: Aplicando un Material al Plano
Ahora, vamos a aplicar este nuevo Material a nuestro GameObject “Plane”.
- Selecciona el GameObject “Plane” en la ventana de Jerarquía.
- En la ventana de Inspector, busca el componente “Mesh Renderer“. Este componente es responsable de dibujar el objeto en la pantalla y contiene la propiedad “Materials“.
- Arrastra el Material “MaterialPlanoImpactado” desde la ventana de Proyecto hasta el espacio que dice “None (Material)” dentro del componente “Materials” del Inspector del Plano. Ahora, el plano debería aparecer de color rojo en la ventana de Escena.
Nota: Si el plano ya tenía un Material aplicado (el gris predeterminado), simplemente arrastra el nuevo Material sobre él para reemplazarlo.
Paso 3: Creando un Script para Cambiar el Material
Vamos a crear un nuevo script que adjuntaremos al plano. Este script detectará la colisión con el cubo y cambiará el Material del plano al Material rojo que creamos.
- Ve a la ventana de Proyecto.
- Haz clic derecho en cualquier espacio vacío, selecciona “Crear” y luego “C# Script“.
- Nombra este script “CambiarMaterialAlColisionar” y haz doble clic para abrirlo en tu editor de código.
Paso 4: Escribiendo el Código para Cambiar el Material
Reemplaza el contenido del script “CambiarMaterialAlColisionar.cs” con el siguiente código:
using UnityEngine;
public class CambiarMaterialAlColisionar : MonoBehaviour
{
public Material materialAlImpacto; // Arrastraremos nuestro Material rojo aquí en el Inspector
private Material materialOriginal;
private Renderer objetoRenderer;
void Start()
{
// Obtener el componente Renderer del objeto al que está adjunto este script (el Plano)
objetoRenderer = GetComponent<Renderer>();
// Guardar el material original para poder restaurarlo después
if (objetoRenderer != null)
{
materialOriginal = objetoRenderer.material;
}
}
void OnCollisionEnter(Collision collision)
{
// Verificar si el objeto con el que colisionamos es el Cubo (puedes ajustar la lógica si tienes varios objetos)
if (collision.gameObject.name == "Cube")
{
// Cambiar el material al material de impacto
if (objetoRenderer != null && materialAlImpacto != null)
{
objetoRenderer.material = materialAlImpacto;
}
}
}
// Opcional: Podemos añadir una lógica para cambiar el material de vuelta después de un tiempo
// void OnCollisionExit(Collision collision)
// {
// if (collision.gameObject.name == "Cube")
// {
// if (objetoRenderer != null && materialOriginal != null)
// {
// objetoRenderer.material = materialOriginal;
// }
// }
// }
}
Lenguaje del código: HTML, XML (xml)
- Guarda el script.
Explicación del Código:
- public Material materialAlImpacto;: Declaramos una variable pública de tipo Material. Arrastraremos nuestro Material “MaterialPlanoImpactado” a este espacio en el Inspector del Plano.
- private Material materialOriginal;: Variable privada para almacenar el Material original del plano.
- private Renderer objetoRenderer;: Variable privada para almacenar el componente Renderer del plano.
- void Start(): Esta función se llama una vez al inicio. Aquí obtenemos el componente Renderer del GameObject al que está adjunto este script (el Plano) usando GetComponent() y guardamos su material original.
- void OnCollisionEnter(Collision collision): Al igual que en el script del cubo, esta función se llama cuando ocurre una colisión.
- if (collision.gameObject.name == “Cube”): Verificamos si el nombre del GameObject con el que colisionamos es “Cube”. Esto nos permite especificar con qué objeto queremos que el plano reaccione.
- if (objetoRenderer != null && materialAlImpacto != null): Nos aseguramos de que tanto el Renderer como el Material de impacto estén asignados antes de intentar cambiarlos.
- objetoRenderer.material = materialAlImpacto;: Esta línea es la clave. Accedemos a la propiedad material del componente Renderer y la cambiamos por nuestro materialAlImpacto (el rojo).
- // void OnCollisionExit(…): El código comentado muestra cómo podríamos cambiar el material de vuelta al original cuando la colisión finaliza. Puedes descomentarlo y probarlo si quieres un efecto temporal.
Paso 5: Adjuntando el Script al Plano y Asignando el Material
- Selecciona el GameObject “Plane” en la ventana de Jerarquía.
- Arrastra el script “CambiarMaterialAlColisionar.cs” desde la ventana de Proyecto hasta la ventana de Inspector del Plano.
- En el Inspector del Plano, verás el componente “Cambiar Material Al Colisionar (Script)” con un espacio que dice “Material Al Impacto (Material)”.
- Arrastra el Material “MaterialPlanoImpactado” desde la ventana de Proyecto hasta este espacio.
Paso 6: ¡Probando la Reacción a la Colisión!
- Asegúrate de que el cubo esté inicialmente por encima del plano en la ventana de Escena.
- Haz clic en el botón de “Play” en la Barra de Herramientas.
- Utiliza las teclas de movimiento para mover el cubo hacia el plano y hacer que lo toque.
- Observa el plano en la ventana de Juego. ¡Debería cambiar de color al rojo cuando el cubo lo toque!
¡Felicidades! Has logrado que tu juego tenga una respuesta visual a una interacción. Has aprendido a crear y aplicar Materiales y cómo acceder y modificar el Material de un objeto a través de un script utilizando el componente Renderer.
En el próximo y último capítulo de esta serie, ¡añadiremos un objetivo simple a nuestro juego! ¡Estamos casi ahí!