Ir al contenido principal

Collider triggers y raycasting en Unity

Nunca te irás a la cama sin aprender algo nuevo, así que ya saben, si no han aprendido algo hoy, no duerman. Ayer investigué un poco acerca de cómo utilizar debidamente la opción Trigger de los colliders en Unity3D, y al fin logré aclarar ciertos puntos oscuros.
El caso es que estaba intentando implementar un sistema sensorial para un RPG: emular visión y audición. La idea inicial era usar un sphere collider, que puesto en modo trigger me avisaría si el personaje entra en el rango de percepción del NPC. La cosa no era así de fácil, pues me encontré con un efecto desagradable: era imposible entrar en el área del collider.
En teoría, un collider con la opción Trigger activada debería ignorar los raycasts, de hecho, dejando de ser un collider para convertirse en un disparador de eventos, pero resulta que no es así. Este comportamiento hay que habilitarlo, yendo a Project Settings->Physics y desactivando Query hit triggers.
Y ya, eso era todo. Sin embargo, esto tuvo un efecto secundario (completamente lógico, claro) que descubrí más tarde. Cuando intenté utilizar un collider para detectar el evento Mouse Over en un objeto de la escena no funcionó. Obviamente, era imposible ya que el collider estaba ignorando los raycasts. Supongo que tendré que buscar otra variante para solucionar esto, aunque en realidad no es importante.Aquí lo que intentaba era colocar un botón sobre el objeto que al cliquearse mostrara información sobre el mismo, algo típico de los RPG.
Y esto me recuerda un importante consejo, que aunque obvio, puede pasarse por alto en equipos grandes: todos los modelos deben compartir un factor de escala común. Mientras intentaba colocar el canvas en el objeto, me encontré que los valores que funcionaban en otro proyecto no lo hacían en este. El origen del error era ese: en un proyecto usaba un modelo con escala 1, y aquí estaba poniendo el canvas como hijo de otro modelo que necesitaba escalarse 500 veces. El resultado, el canvas también crecía y no cabía en la escena. Tuve que agrandar el objeto en Blender y todo fue como la seda. Pero ya había hecho una rabieta y el tiempo estaba perdido.

Comentarios