Bienvenido a este codelab de nuestro curso sobre desarrollo de aplicaciones XR. En este apartado, veremos errores comunes que se pueden presentar a la hora de desarrollar nuestra aplicación XR y cómo podremos corregirlos.
En algunos casos, como el que ves en la imagen, al dar Play a nuestra escena puede que los objetos empiecen a caer de forma indefinida, atravesando otros elementos del entorno sin detenerse. Esto suele ocurrir después de haber añadido un componente RigidBody a un objeto.
Como sabemos, el componente RigidBody permite que un objeto responda a las fuerzas físicas del entorno, incluyendo la gravedad. Si la casilla Use Gravity está activada (por defecto lo está), el objeto caerá. Sin embargo, para que esta caída se detenga al llegar a otro objeto —por ejemplo, un plato, una mesa o el suelo—, es indispensable que se cumplan ciertas condiciones. A continuación, se listan las causas más comunes de este error, junto con sus soluciones:
1. Falta de Collider
Causa: Uno de los objetos involucrados no tiene ningún componente Collider.
Solución: Verifica que tanto el objeto que cae (por ejemplo, una manzana) como el objeto receptor (el plato o el suelo) tengan componentes de colisión. Puedes usar Box Collider, Sphere Collider, Mesh Collider, entre otros, según el caso.
2. Uso incorrecto del Mesh Collider
Causa: El objeto tiene un Mesh Collider, pero este no está adecuadamente configurado. Por ejemplo, se está usando el mesh incorrecto del prefab.
Solución: Asegúrate de que el Mesh Collider esté utilizando el mesh adecuado del modelo 3D. Si el prefab tiene múltiples meshes, selecciona manualmente el que represente el volumen correcto del objeto.
Tip: Puedes verificar o cambiar el mesh del Mesh Collider desde el campo Mesh en el Inspector.
3. Mesh Collider no convexo en objetos complejos
Causa: El Mesh Collider del objeto receptor (por ejemplo, el plato) no está marcado como Convex, lo cual impide su interacción adecuada con objetos dinámicos que tienen Rigidbody.
Solución: Activa la casilla Convex en el Mesh Collider del objeto receptor. Unity solo permite colisiones entre un Rigidbody y un Mesh Collider si este último es convexo.
¿Por qué convexo? Unity no permite colisiones entre Rigidbody y Mesh Colliders no convexos por razones de rendimiento y estabilidad en el motor físico. Marcarlo como convexo simplifica la geometría y permite detectar colisiones correctamente.
Solucionando estos problemas nuestros objetos deberían colisionar correctamente, y, en este ejemplo, las manzanas no caerían indefinidamente, sino que colisionaron con el platón.
En proyectos con múltiples objetos y scripts, una mala asignación de etiquetas (tags) puede causar errores críticos al momento de ejecutar la escena. Uno de los errores más comunes es usar un tag reservado para objetos controlados por un script específico en objetos que no deberían tenerlo.
Ejemplo del error
Supongamos que en tu proyecto de cultivos tienes una etiqueta llamada "cultivos" que se usa para identificar exclusivamente objetos que tienen el script ControladorMaduracion. Este script permite saber si un alimento ya está maduro o no.
El problema surge cuando se asigna este tag a objetos que no poseen ese script (por ejemplo, una planta decorativa o un prefab de referencia), como en el caso de la "Planta de Maíz".
¿Qué sucede?
El script ControladorCultivos busca automáticamente todos los objetos con el tag "cultivos" y asume que todos ellos tienen el componente ControladorMaduracion. El siguiente fragmento de código lo demuestra:
foreach (GameObject alimento in objetosCultivos)
{
if(alimento.GetComponent
{
contador++;
}
}
Si alguno de los objetos con ese tag no tiene el componente, al ejecutar el método
.GetComponent<ControladorMaduracion>() se devolverá
null, y al intentar acceder a
.estaMaduro, se generará una excepción del tipo:
Solución
Usa los tags con cuidado:
En escenas XR, es común configurar objetos para que puedan ser agarrados o manipulados. Sin embargo, a veces al probar la escena, el objeto no responde al intento de interacción. Un caso típico en tu proyecto es cuando intentas agarrar una manzana, pero al apuntarle con el rayo del controlador no pasa nada.
Causas comunes
1. Falta de Collider
Unity necesita que el objeto tenga un Collider para detectar cualquier tipo de contacto o interacción. Si tu manzana no tiene un Sphere Collider, Box Collider u otro tipo de collider, no podrá detectarse ni agarrarse.
Solución: Agrega un collider adecuado desde el Inspector. Para objetos redondeados como una manzana, un Sphere Collider funciona bien. Ajusta el tamaño si es necesario.
2. Falta del componente XR Grab Interactable
El componente XR Grab Interactable es esencial para que el sistema XR permita que un objeto pueda ser agarrado con los rayos de los controladores. Si este componente no está presente, la interacción no será posible.
Solución
: Añade el componente XR Grab Interactable al objeto desde el botón "Add Component" en el Inspector.
Solucionando y revisando estos detalles ya podrás interactuar y agarrar tus objetos:
¡Felicidades! Has completado el codelab de Resolución de Errores comunes. Puedes usar este como guía en caso de que presentes algún error inesperado a la hora de resolver los ejercicios de nuestro proyecto. ¡Suerte!