Mais recentemente, o plugin ml-agents foi atualizado. Para quem não sabe, este é um plug-in de código aberto que é um ambiente para treinar agentes na unidade. Eles podem ser treinados usando aprendizado por reforço, imitação, neuroevolução ou outros métodos de aprendizado de máquina usando a API Python. Ele também fornece vários algoritmos modernos (baseados no TensorSlow) que permitem criar NPCs mais inteligentes para seus jogos.
O que você precisa para implementar o aprendizado de máquina no Unity?
Faça o download deste plugin
aqui . Você precisará da pasta unity-envonment. Antes disso, crie um projeto vazio. Na pasta Assets, adicione o conteúdo da pasta Assets com ambiente de unidade. Faça isso com ProjectSettings. Observe que, se você adicionar esse plug-in a um projeto existente, primeiro crie um projeto vazio, siga as etapas acima e crie um pacote (Assets-ExportPackage) e, em seguida, simplesmente importe-o para o seu projeto existente. Isso é necessário para que você não perca as configurações existentes do ProjectSettings no seu projeto.
Vou demonstrar a implementação do aprendizado de máquina usando o exemplo de um jogo de futebol (essa cena já está no plugin). Tem duas equipes, azul e vermelha. Cada equipe tem um atacante e goleiro.
Vamos voltar ao próprio plugin. Para que ele trabalhe no palco, precisamos de pelo menos um objeto Academia, Cérebro e Agente. O esquema de interação pode ser visto abaixo.

O objeto Academy e suas subsidiárias GoalieBrain, StrikerBrain estão localizados no palco. Como podemos ver no diagrama, cada Academia pode ter vários Cérebros, mas cada Cérebro deve ter uma Academia.
Agente - esses são nossos objetos de jogo que queremos treinar.

Em seguida, vá para o código. A classe SoccerAcademy, que foi adicionada à GameObject Academy, é herdada da classe Academy. Antes disso, você deve adicionar um espaço para nome usando MLAgents. Depois disso, devemos substituir os métodos
public override void AcademyReset() { } public override void AcademyStep() { }
E adicione links criados por Brain
public Brain brainStriker; public Brain brainGoalie;
Adicione um componente do cérebro ao GoalieBrain, StrikerBrain e atribua-o à Academia

A classe AgentSoccer herda do Soccer. Adicione-o a cada jogador e indique qual cérebro será usado.

No script AgentSoccer, descrevemos a lógica dos jogadores. No método CollectObservations () substituído, adicionamos uma lista de raios que ajudarão os jogadores a monitorar e responder à jogabilidade.
public override void CollectObservations() { float rayDistance = 20f; float[] rayAngles = { 0f, 45f, 90f, 135f, 180f, 110f, 70f }; string[] detectableObjects; if (team == Team.red) { detectableObjects = new string[] { "ball", "redGoal", "blueGoal", "wall", "redAgent", "blueAgent" }; } else { detectableObjects = new string[] { "ball", "blueGoal", "redGoal", "wall", "blueAgent", "redAgent" }; } AddVectorObs(rayPer.Perceive(rayDistance, rayAngles, detectableObjects, 0f, 0f)); AddVectorObs(rayPer.Perceive(rayDistance, rayAngles, detectableObjects, 1f, 0f)); }
O método AgentAction substituído é um análogo de Update. Nele, chamamos o método move e distribuímos as recompensas.
public override void AgentAction(float[] vectorAction, string textAction) {
Se tocarmos na bola, empurre-a
void OnCollisionEnter(Collision c) { float force = 2000f * kickPower; if (c.gameObject.tag == "ball") { Vector3 dir = c.contacts[0].point - transform.position; dir = dir.normalized; c.gameObject.GetComponent<Rigidbody>().AddForce(dir * force); } }
Redefinir comandos quando a meta for concluída
public override void AgentReset() { if (academy.randomizePlayersTeamForTraining) { ChooseRandomTeam(); } if (team == Team.red) { JoinRedTeam(agentRole); transform.rotation = Quaternion.Euler(0f, -90f, 0f); } else { JoinBlueTeam(agentRole); transform.rotation = Quaternion.Euler(0f, 90f, 0f); } transform.position = area.GetRandomSpawnPos(team.ToString(), agentRole.ToString()); agentRB.velocity = Vector3.zero; agentRB.angularVelocity = Vector3.zero; area.ResetBall(); }
Opções de treinamento
Você pode treinar agentes do editor de unidade, bem como usar o
TensorFlow . Quanto à unidade, você precisa especificar o castigo e a recompensa para cada Cérebro na Academia.

Também vale a pena informar ao Brain seu TypeBrain, definindo o valor como Externo. Eles também vêm nos seguintes tipos:
- Externo - onde as decisões são tomadas usando a API Python. Aqui, as observações e recompensas geradas pelo Brain são redirecionadas para a API do Python por meio de um comunicador externo. A API Python retorna a ação apropriada que o agente deve executar.
- Interno - onde as decisões são tomadas usando o modelo TensorFlow interno. O modelo aninhado TensorFlow representa uma política científica, e o Brain usa diretamente esse modelo para determinar a ação de cada agente.
- Player - onde as decisões são tomadas usando a entrada real do teclado ou do controlador. Aqui, o jogador humano controla o Agente, e as observações e recompensas coletadas pelo Cérebro não são usadas para controlar o Agente.
- Heurística - onde as decisões são tomadas usando um comportamento codificado. É semelhante à forma como a maioria dos comportamentos de caracteres é atualmente definida e pode ser útil para depurar ou comparar como um Agente com regras codificadas se compara a um Agente cujo comportamento foi treinado.