Oi Habr. Minha história começa em janeiro de 2019.
Eu e meus desenvolvedores de jogos Tima decidimos assumir o maior projeto da nossa história, um jogo de plataformas 2D. Não, nós não fizemos FlappyBirds ou cobras antes, mas a quantidade de trabalho neste projeto apenas explodiu nosso cérebro. Para começar, abandonamos as habituais escadas verticais e subimos as escadas. Escrevemos a lógica para as portas, que podiam ser trancadas “com uma chave” e parafusamos os blocos destrutíveis. Chegou um momento em que era necessário escrever Inteligência Artificial. Como roteirista mais experiente de nossa equipe inexperiente, a honra de escrever AI caiu sobre mim.
Chorei no travesseiro, sem entender o que fazer, fiquei muito orgulhosa por escrever uma das mecânicas mais difíceis do nosso projeto.
Etapa 1: encontrar o caminho e mover-se ao longo do caminho
Etapa 1.1: Encontrando o caminho
Como as localizações principais não estarão ao ar livre, mas sim nos prédios, foi necessário procurar o percurso entre dezenas de portas, escadas e salas. Depois de pensar, o líder da equipe decidiu que valia a pena fazer uma certa paródia do algoritmo A *, onde teríamos nós entre os quais o bot seria executado. fez uma cena de teste, colocou os nós, para maior clareza, pendurou o SprateRenderers neles. O que fazer depois?
Com essa pergunta em mente, caminhei por 3 dias. Até agora, um dos meus camaradas não propôs um algoritmo interessante quando os nós serão excitados, como neurônios cerebrais.
Então Existe um nó A, próximo ao qual existe uma IA e um nó B, para o qual a AI deve chegar. deu a todos os nós seu ID e marcou os nós conectados aos quais eles enviarão um sinal. Cada nó tinha sua própria variável booleana "isChecked" e a variável "triggeredBy", que continha o ID do nó que o "excitou". Portanto, quando o nó B é afetado, ele passa pela cadeia para o nó A, reconhecendo todos os IDs dos nós pelos quais o sinal passou. Então, eu peguei o caminho a partir dos IDs dos nós pelos quais o bot deve percorrer. Se de repente você não entender como isso funciona, eu vou lhe contar uma história.
Uma vez, Ivan não tinha nada para fazer, e então decidiu criar sua árvore genealógica. Infelizmente, ele não tinha informações suficientes para traduzir essa ideia em realidade. Ivan ficou tão entusiasmado com essa idéia que decidiu que, quando chegasse ao progenitor principal, seria capaz de descobrir seus parentes inesperados. Ivan sabia onde poderia encontrar o pai para conversar e foi até lá. O pai disse a ele que o nome do avô de Ivan era Ivan e disse onde ele poderia ser encontrado. Ivan encontrou Ivan e disse que o bisavô de Ivan podia conhecer esse ancestral pessoalmente, mas ele havia morrido há muito tempo. Ivan dedicou metade de sua vida ao estudo das artes das trevas, mas no final conseguiu ressuscitar seu bisavô. O bisavô disse que seu ancestral é um lobisomem e que seu corpo está enterrado na beira dos três pinheiros. Ivan foi até lá e encontrou um homem cavando uma cova. Aconteceu que este homem é o primo de doze anos Ivan. Ivan ficou muito surpreso por eles terem chegado a um lugar, mas seu irmão acabou por ser um programador e explicou tudo.
- O princípio de navegação do meu jogo favorito * nome * funciona aqui!
- e o que é isso?
- De cada herdeiro, você pode chegar ao pai ou mãe comum do sistema, se nesse sistema, cada herdeiro conhece pessoalmente seu pai.
Aqui está o resultado:

Essa é uma matriz de variáveis int que significa os IDs dos nós pelos quais a unidade deve passar.
Etapa 1.2.1: movimento ao longo do caminho
Eu tenho uma lista de IDs de nó, eu tenho um bot. O que vem a seguir? E então o que você precisa para mover o bot por esse caminho.
Bem, imaginei esta opção: o bot alcançou o nó, conferiu, olhou o que era o próximo, foi para o próximo nó. Fiz isso. Ganhou. Fiquei feliz ... Mas ...
Etapa 1.2.2: escadas e sua interação com a IA
Como dizia um herói em preto e branco: "Escadas ... meu principal inimigo ..."
Foi necessário determinar se o próximo nó está acima da IA, abaixo ou no nível. Dependendo dessas informações, ele passará pelas escadas (ignorará a colisão) ou subirá nela (interagir com a colisão). Ah, e muitas células nervosas morreram nessa batalha com o mecanismo ... Nos fóruns, li que você pode organizar tudo em camadas e, na guia Editar-> Física2D, você pode configurar a ignição de colisões de uma camada e outra. Tudo funcionou!
Resta apenas ensiná-lo a abrir a porta. Não houve problemas.
O resultado:


Etapa 2: Emoções e Dicas
Etapa 2.1: Emoções
Sim, decidimos anexar emoções ... E pistas.
As emoções serão destacadas com expressões faciais e animações de ação.
As réplicas serão exibidas com texto em cima.
Eu estraguei as emoções de uma só vez ... Por isso, eu já criei a variável "emotionID", que armazenava o ID da emoção. E aqui estão as réplicas ...
Etapa 2.2: réplicas
Para a beleza fez uma classe separada Frases
[System.Serializable]
Fez uma matriz dessa classe. Além disso, apenas dependendo do emotionID, coloquei qualquer frase da lista. Atualizado uma vez a cada N segundos.
Mas eu decidi ir mais longe! Para cada caractere, criei um arquivo com a extensão .phrs, codificando-o adicionando X bytes ao número de bytes de cada caractere no arquivo. O resultado foi um texto ilegível e imutável. fez algo como sua marcação, criou um algoritmo que pega e traduz tudo nessa matriz para a classe Phrases por essa marcação.
Ótimo! Tudo funciona!
Eu queria escrever um programa em um sharpe limpo para preencher esse arquivo, mas aqui vamos para o final da história.
O fim ..?
Estávamos cansados do trabalho grande e não remunerado ... Anexar um novo codificador não ajudou ... A equipe se desfez ... O código ainda está na nuvem do Unity.
Obviamente, não faz muito tempo, surgiu a idéia de continuar o projeto, mas com mais monetização ... Se algo der certo, provavelmente escreverei toda a história do desenvolvimento. Mas é aqui que minha história sobre o script iniciante e a IA termina.