Hallo Habr. Meine Geschichte beginnt im Januar 2019.
Meine Tima-Spieleentwickler und ich haben beschlossen, das größte Projekt in unserer Geschichte aufzunehmen, einen 2D-Plattformer. Nein, wir haben vorher noch keine FlappyBirds oder Schlangen gemacht, aber die Menge an Arbeit in diesem Projekt hat uns einfach umgehauen. Zunächst gaben wir die üblichen vertikalen Treppen auf und gingen die Stufentreppe hinauf. Wir haben die Logik für die Türen geschrieben, die „mit einem Schlüssel“ verschlossen werden konnten, und die zerstörbaren Blöcke verschraubt. Es kam eine Zeit, in der es notwendig war, künstliche Intelligenz zu schreiben. Als erfahrenster Scripter unseres unerfahrenen Teams fiel mir die Ehre zu, KI zu schreiben.
Ich weinte in das Kissen und verstand nicht, was ich
tun sollte. Ich war sehr stolz darauf, dass ich eine der schwierigsten Mechaniken in unserem Projekt schreiben würde.
Stufe 1: Finden des Pfades und Bewegen des Pfades
Schritt 1.1: Den Weg finden
Da die Hauptstandorte nicht im Freien, sondern in Gebäuden liegen, musste nach einer Route zwischen Dutzenden von Türen, Treppen und Räumen gesucht werden. Nach dem Nachdenken entschied der Teamleiter, dass es sich lohnt, eine bestimmte Parodie des A * -Algorithmus durchzuführen, bei der Knoten vorhanden sind, zwischen denen der Bot ausgeführt wird. machte eine Testszene, legte die Knoten, der Klarheit halber, hängte SprateRenderer an sie. Was ist als nächstes zu tun?
Mit dieser Frage ging ich 3 Tage lang. Bisher hat einer meiner Kameraden keinen interessanten Algorithmus vorgeschlagen, bei dem die Knoten wie Gehirnneuronen angeregt werden.
Also. Es gibt einen Knoten A, in dessen Nähe sich eine KI befindet, und einen Knoten B, zu dem die KI kommen soll. gab allen Knoten ihre ID und markierte die verbundenen Knoten, an die sie ein Signal senden werden. Jeder Knoten hatte seine eigene boolesche Variable "isChecked" und die Variable "triggerBy", die die ID des Knotens enthielt, der ihn "angeregt" hat. Wenn also Knoten B betroffen ist, durchläuft er die Kette zu Knoten A und erkennt alle IDs der Knoten, die das Signal durchlaufen hat. Also habe ich den Pfad von der ID der Knoten erhalten, die der Bot durchlaufen sollte. Wenn Sie plötzlich nicht mehr verstehen, wie das funktioniert, werde ich Ihnen eine Geschichte erzählen.
Einmal hatte Ivan nichts zu tun und beschloss, seinen Stammbaum zu erstellen. Leider hatte er nicht genügend Informationen, um diese Idee in die Realität umzusetzen. Ivan war so begeistert von dieser Idee, dass er beschloss, seine unerwarteten Verwandten zu entdecken, wenn er den Hauptvorfahren erreichte. Ivan wusste, wo er sich mit seinem Vater treffen konnte, um zu reden und ging dorthin. Vater sagte ihm, dass Iwans Großvater Ivan hieß und wo er gefunden werden konnte. Ivan fand Ivan und sagte, dass Iwans Urgroßvater diesen Vorfahren persönlich kennen könnte, aber er war längst gestorben. Ivan widmete sein halbes Leben dem Studium der dunklen Künste, aber am Ende konnte er seinen Urgroßvater wiederbeleben. Der Urgroßvater sagte, sein Vorfahr sei ein Werwolf und sein Körper sei am Rande der drei Kiefern begraben. Ivan ging dorthin und fand einen Mann, der ein Grab grub. Es stellte sich heraus, dass dieser Mann der Zwölf-Cousin Ivan ist. Ivan war sehr überrascht, dass sie an einen Ort kamen, aber sein Bruder erwies sich als Programmierer und erklärte alles.
- Das Prinzip der Navigation aus meinem Lieblingsspiel * Name * funktioniert hier!
- Und was ist das?
- Von jedem Erben können Sie zum gemeinsamen Elternteil des Systems kommen, wenn in diesem System jeder Erbe seinen Elternteil persönlich kennt.
Hier ist das Ergebnis:

Dies ist ein Array von int-Variablen, die die IDs der Knoten bedeuten, die die Einheit durchlaufen soll.
Schritt 1.2.1: Bewegung entlang des Pfades
Ich habe eine Liste von Knoten-IDs, ich habe einen Bot. Was weiter? Und dann, was Sie brauchen, um den Bot auf diesem Weg zu bewegen.
Nun, ich dachte mir diese Option: Der Bot erreichte den Knoten, überprüfte, schaute, was als nächstes kam, ging zum nächsten Knoten. Hab es geschafft. Verdient. Ich war froh ... Aber ...
Stufe 1.2.2: Leitern und ihre Interaktion mit der KI
Wie ein schwarz-weißer Held sagte: "Treppen ... mein Hauptfeind ..."
Es musste festgestellt werden, ob sich der nächste Knoten über der KI, unter oder auf der Ebene befindet. Abhängig von diesen Informationen passiert er die Treppe (ignoriert die Kollision) oder klettert darauf (interagiert mit der Kollision). Oh, und viele Nervenzellen sind in diesem Kampf mit der Engine gestorben ... In den Foren habe ich gelesen, dass Sie alles in Ebenen anordnen können und auf der Registerkarte Bearbeiten-> Physik2D das Ignorieren von Kollisionen einer Ebene und einer anderen konfigurieren können. Es hat alles geklappt!
Es bleibt ihm nur beizubringen, die Tür zu öffnen. Es gab keine Probleme.
Das Ergebnis:


Stufe 2: Emotionen und Hinweise
Stufe 2.1: Emotionen
Ja, wir haben beschlossen, Emotionen zu verbinden ... und Hinweise.
Emotionen werden mit Mimik und Action-Animationen hervorgehoben.
Replikate werden mit Textaufwand angezeigt.
Ich habe Emotionen auf einmal geschraubt ... Dafür habe ich bereits die Variable "emotionsID" erstellt, in der die ID der Emotion gespeichert ist. Und hier sind die Repliken ...
Schritt 2.2: Replikate
Für die Schönheit machte eine separate Klasse Sätze
[System.Serializable]
Hat ein Array dieser Klasse erstellt. Außerdem habe ich, abhängig von emotionsID, einen beliebigen Satz aus der Liste eingefügt. Einmal alle N Sekunden aktualisiert.
Aber ich habe beschlossen, weiter zu gehen! Für jedes Zeichen habe ich eine Datei mit der Erweiterung .phrs erstellt und diese durch Hinzufügen von X Bytes zur Bytenummer jedes Zeichens in der Datei codiert. Das Ergebnis war unlesbarer, unveränderlicher Text. hat so etwas wie sein Markup gemacht, einen Algorithmus erstellt, der alles in dieses Array aufnimmt und in die Phrases-Klasse übersetzt.
Großartig! Alles arbeitet!
Ich wollte ein Programm auf einem sauberen Sharpe schreiben, um eine solche Datei auszufüllen, aber hier gehen wir zum Ende der Geschichte.
Das Ende ..?
Wir hatten die große, unbezahlte Arbeit schnell satt ... Das Anbringen eines neuen Encoders half nicht ... Das Team fiel auseinander ... Der Code liegt immer noch in der Unity-Cloud.
Natürlich entstand vor nicht allzu langer Zeit die Idee, das Projekt fortzusetzen, aber mit weiterer Monetarisierung ... Wenn etwas klappt, werde ich wahrscheinlich die gesamte Geschichte der Entwicklung schreiben. Aber hier endet meine Geschichte über den Anfänger und die KI.