La solución al problema de ayer era...

Habíamos dejado esta historia más o menos lista para el final de temporada. El protagonista (o sea, yo) se enfrentaba a un terrible enemigo: ¡el error de detección de colisiones!, que se las había arreglado para colarse en mi sistema de IA. Burlándose continuamente de todos y cada uno ed mis esfuerzos, casi había conseguido su objetivo de dominar el mundo. O algo así. Entonces, el héroe (yo mismo), acudió a su intelecto superior, previamente remojado en cerveza de los carnavales, algo que viene a ser como un agua fría, amarillenta y ligeramente amarga. Y como suele suceder en los finales de temporada, el bueno ganó.
Técnicamente, lo que hice fue comparar qué había en el proyecto que funcionaba que no hubiese en el proyecto que no funcionaba. Entonces encontré lo opuesto: algo que no había en el viejo y que sí había en el nuevo. En concreto, un Rigid Body. Ni idea de por qué está interfiriendo en las colisiones, pero así es. Una vez que eliminé el Rigid Body del GameObject del personaje, las colisiones funcionaron todo el tiempo. Tengo pendiente investigar por qué razón sucede esto, y les contaré luego si encuentro alguna respuesta.

Encabronado de verdad verdadera

Pues eso. Tego un encabronamiento, cabreo, empingue, o como quieran llamarlo, de tres pares de cojones. Qué tres pares, de tres pares y medio. He tenido que reescribir todo el sistema de IA para volver a lo mismo, que se dice fácil, pero no lo es.
La cosa es que ayer, luego de terminar de pulir detallitos, me puse a probar la nueva implementación. Para mi sorpresa, el error anterior persistía: un rato después de detectar la primera colisión, simplemente el BoxCast deja de detectar más colisiones. Vuelvo a las aplicación de prueba básica y resulta que funciona todo ok; mientras solo tenga un par de cubos en la escena, el cast detecta o no según corresponda, todo el tiempo necesario. Por tanto, puedo descartar un bug de Unity. Cuando las cosas se ponen un poco más serias, se jode el asunto bien jodido. Digan ustedes si no es como para coger un mosqueo olímpico y cagarse en los 300 mil dioses de la India.
Sería lógico pensar que tengo algún timer o algo que causa el problema, pero no. Eliminé todo lo relacionado con temporizadores y degradé el sistema a lo más básico y cercano a la aplicación de prueba, un simple "te estoy viendo/no te estoy viendo". Aún así, el error sigue.
Conclusión, que estoy metido en un lío que parece no tener solución, sin nadie a quien acudir. Ni en reddit, ni en el foro oficial he podido encontrar respuesta acerca de esto. No es un bug, o al menos no puedo probar que lo sea. Tampoco se me ocurre otra variante para detectar los personajes en el rango "visible", excepto calcular distancias y lanzar rayos a montones hacia los personajes cercanos. En este momento, solo sé a ciencia cierta unas pocas cosas: el cast funciona, lo hace en la aplicación de prueba y lo hace en un proyecto viejo. No es un temporizador en mal lugar, en el proyecto viejo los temporizadores funcionan perfectamente y en el nuevo los eliminé, pero eso no solucionó la cuestión. ¿Podrían ser los modelos? Lo único diferente entre el proyecto viejo, la aplicación de prueba y el proyecto nuevo son los modelos usados. Hoy tendré que hacer pruebas adicionales desactivando animaciones y verificando a fondo los colliders incluidos en cada objeto. A ver si tengo suerte... 

Nuevo sistema de IA


Han sido unos días de terrible calor (récord de temperatura a escasos 100km de aquí, para que luego no digan que el calentamiento global es un cuento) y largos apagones, por lo que tendrán que disculpar mi ausencia y poquísimos deseos de hacer algo. Mayormente he dedicado el tiempo a jugar, corregir la última novela, que no salió del todo buena (más bien mala), y pensar un poco en cómo arreglar el sistema de inteligencia artificial.
Era algo que llegaría tarde o temprano. La IA que implementé basada en e tutorial oficial de Unity se quedaba corta, tenía que arreglar sus carencias en algún momento. Y qué mejor momento que ahora, cuando descubrí que un error casi imposible de rastrear provocaba que los casts dejasen de funcionar un minuto después de detectada la primera colisión. No tenía otra opción.
Cuando puse manos a la obra me percaté de que no había pensado tanto como creía, sino que más bien había estado justificando mi inactividad con la excusa de que "estaba rediseñando el sistema". En mi idea habían muchas cosas sacadas del sistema anterior que ahora no funcionarían, a menos que copiase lo viejo casi por completo. Y en principio, eso no era lo que pretendía. En fin, que toca pensar un poco más, para que el nuevo diseño sea flexible y potente.
En esencia, sigo utilizando ScriptableObjects, pero ahora el gestor de estados tendrá una lista completa de lodos los estados del personaje y podrá cambiar de uno a otro. El subsistema de sensores (porque en teoría, podría tener un sensor para la vista y otro para el oído, por ejemplo) se desplaza del estado como tal a la lógica. Y cada estado podrá contener una o varias lógicas, que serían como los ladrillos que forman la IA como tal, encargándose de la toma de decisiones. Suena un poco confuso porque en realidad es confuso y no pasa de ser una idea sin probar y sin implementar. Supongo que hablar de ella hace que me percate de todos los fallos. Pero creo que una vez que resuelva todos los pequeños detalles, debería funcionar.