Hola Habr Mi historia comienza en enero de 2019.
Mis desarrolladores de juegos de Tima y yo decidimos emprender el proyecto más grande de nuestra historia, un juego de plataformas en 2D. No, no hicimos FlappyBirds o serpientes antes, pero la cantidad de trabajo en este proyecto simplemente nos dejó sin aliento. Para empezar, abandonamos las escaleras verticales habituales y tomamos las escaleras. Escribimos la lógica de las puertas, que podrían cerrarse "con una llave" y atornillar los bloques destructibles. Llegó un momento en que era necesario escribir Inteligencia Artificial. Como el scripter más experimentado de nuestro equipo inexperto, el honor de escribir AI me cayó a mí.
Lloré sobre la almohada, sin entender qué hacer, estaba muy orgulloso de poder escribir una de las mecánicas más difíciles de nuestro proyecto.
Etapa 1: encontrar el camino y moverse a lo largo del camino
Paso 1.1: Encontrar el camino
Como las ubicaciones principales no estarán al aire libre, sino en los edificios, fue necesario buscar la ruta entre docenas de puertas, escaleras y habitaciones. Después de pensar, el líder del equipo decidió que valía la pena hacer una cierta parodia del algoritmo A *, donde tendríamos nodos entre los cuales se ejecutaría el bot. hizo una escena de prueba, colocó los nodos, para mayor claridad, colgó SprateRenderers sobre ellos. ¿Qué hacer a continuación?
Con esta pregunta en mente, caminé durante 3 días. Hasta ahora, uno de mis camaradas no ha propuesto un algoritmo interesante cuando los nodos estarán excitados, como las neuronas cerebrales.
Entonces Hay un nodo A, cerca del cual hay una IA y un nodo B, al que debe llegar la IA. dio a todos los nodos su ID y marcó los nodos conectados a los que enviarán una señal. Cada nodo tenía su propia variable booleana "isChecked" y la variable "triggeredBy", que contenía el ID del nodo que lo "excitaba". Por lo tanto, cuando el nodo B se ve afectado, pasará por la cadena hasta el nodo A, reconociendo todas las ID de los nodos por los que pasó la señal. Así que obtuve la ruta desde la ID de los nodos por los que debería pasar el bot. Si de repente no entiendes cómo funciona esto, te contaré una historia.
Una vez, Ivan no tenía nada que hacer, por lo que decidió inventar su árbol genealógico. Desafortunadamente, no tenía suficiente información para traducir esta idea en realidad. Ivan estaba tan interesado en esta idea que decidió que cuando llegara al progenitor principal sería capaz de descubrir a sus parientes inesperados. Ivan sabía dónde podía reunirse con su padre para hablar y fue allí. El padre le dijo que el abuelo de Ivan se llamaba Ivan y le dijo dónde podía encontrarlo. Ivan encontró a Ivan, y dijo que el bisabuelo de Ivan podía conocer a este antepasado personalmente, pero hacía mucho que había muerto. Ivan dedicó la mitad de su vida al estudio de las artes oscuras, pero al final pudo resucitar a su bisabuelo. El bisabuelo dijo que su antepasado es un hombre lobo y que su cuerpo está enterrado al borde de los tres pinos. Ivan fue allí y encontró a un hombre cavando una tumba. Resultó que este hombre es el primo Ivan de doce años. Ivan estaba muy sorprendido de que vinieran a un lugar, pero su hermano resultó ser un programador y explicó todo.
- ¡El principio de navegación de mi juego favorito * nombre * funciona aquí!
- Y que es eso?
- De cada heredero, puede llegar al padre común del sistema, si en este sistema cada heredero conoce personalmente a su padre.
Aquí está el resultado:

Este es un conjunto de variables int que significan los ID de los nodos por los que debe pasar la unidad.
Paso 1.2.1: movimiento a lo largo del camino
Tengo una lista de ID de nodo, tengo un bot. Que sigue Y luego lo que necesitas para mover el bot a lo largo de este camino.
Bueno, pensé en esta opción: el bot llegó al nodo, comprobó, miró lo que estaba después, fue al siguiente nodo. Lo hice Ganado Me alegré ... pero ...
Etapa 1.2.2: escaleras y su interacción con la IA
Como solía decir un héroe blanco y negro: "Escaleras ... mi enemigo principal ..."
Era necesario determinar si el siguiente nodo está por encima de la IA, por debajo o al nivel. Dependiendo de esta información, caminará más allá de las escaleras (ignorará la colisión) o subirá a ella (interactuará con la colisión). Ah, y muchas células nerviosas murieron en esta batalla con el motor ... En los foros leí que puedes organizar todo en capas y en la pestaña Editar-> Physics2D puedes configurar ignorar colisiones de una capa y otra. ¡Todo funcionó!
Solo queda enseñarle a abrir la puerta. No hubo problemas
El resultado:


Etapa 2: emociones y señales
Etapa 2.1: Emociones
Sí, decidimos unir emociones ... y señales.
Las emociones se resaltarán con expresiones faciales y animaciones de acción.
Las réplicas se mostrarán con texto sobrecargado.
Atornillé las emociones de una vez ... Para esto, ya hice la variable "emotionID", que almacenaba la identificación de la emoción. Y aquí están las réplicas ...
Paso 2.2: réplicas
Para la belleza hizo una clase separada Frases
[System.Serializable]
Hizo una gran variedad de esta clase. Además, solo dependiendo de emotionID, pongo cualquier frase de la lista. Se actualiza una vez cada N segundos.
¡Pero decidí ir más allá! Para cada carácter hice un archivo con la extensión .phrs, lo codifiqué agregando X bytes al número de bytes de cada carácter en el archivo. El resultado fue texto ilegible, inmutable. hizo algo así como su marcado, creó un algoritmo que toma y traduce todo en esta matriz a la clase Frases por este marcado.
Genial ¡Todo funciona!
Quería escribir un programa en un sharpe limpio para completar dicho archivo, pero aquí vamos al final de la historia.
El final ..?
Nos cansamos rápidamente del gran trabajo no remunerado ... Adjuntar un nuevo codificador no ayudó ... El equipo se vino abajo ... El código aún se encuentra en la nube de Unity.
Por supuesto, no hace mucho tiempo, la idea de continuar el proyecto comenzó a surgir, pero con una mayor monetización ... Si algo funciona, entonces probablemente escribiré toda la historia del desarrollo. Pero aquí es donde termina mi historia sobre el scripter novato y la IA.