Más recientemente, el complemento ml-agents ha sido actualizado. Para aquellos que no lo saben, este es un complemento de código abierto que es un entorno para capacitar a los agentes en la unidad. Pueden ser entrenados usando el aprendizaje por refuerzo, el aprendizaje por imitación, la neuroevolución u otros métodos de aprendizaje automático utilizando la API de Python. También proporciona una serie de algoritmos modernos (basados en TensorSlow) que le permiten crear NPC más inteligentes para sus juegos.
¿Qué necesitas para implementar el aprendizaje automático en Unity?
Descargue este complemento
aquí . Necesitará la carpeta unit-envonment. Antes de eso, crea un proyecto vacío. En la carpeta Assets, agregue el contenido de la carpeta Assets con unity-envonment. Haga esto con ProjectSettings. Tenga en cuenta que si agrega este complemento a un proyecto existente, primero cree un proyecto vacío, siga los pasos anteriores y cree un paquete (Assets-ExportPackage) y luego simplemente impórtelo a su proyecto existente. Esto es necesario para que no pierda la configuración existente de ProjectSettings en su proyecto.
Demostraré la implementación del aprendizaje automático usando el ejemplo de un juego de fútbol (esta escena ya está en el complemento). Tiene dos equipos, azul y rojo. Cada equipo tiene un delantero y portero.
Volvamos al complemento en sí. Para que pueda trabajar en el escenario, necesitamos al menos un objeto Academia, Cerebro y Agente. El esquema de interacción se puede ver a continuación.

El objeto de la Academia y sus filiales GoalieBrain, StrikerBrain se encuentran en el escenario. Como podemos ver en el diagrama, cada Academia puede tener varios Cerebros, pero cada Cerebro debe tener una Academia.
Agente: estos son nuestros objetos de juego que queremos entrenar.

Luego, ve al código. La clase SoccerAcademy, que se agregó a GameObject Academy, se hereda de la clase Academy, antes de eso debes agregar un espacio de nombres usando MLAgents. Después de eso, deberíamos anular los métodos.
public override void AcademyReset() { } public override void AcademyStep() { }
Y agregue enlaces a creados por Brain
public Brain brainStriker; public Brain brainGoalie;
Agregue un componente de cerebro a GoalieBrain, StrikerBrain y asígnelos a Academy

La clase AgentSoccer hereda de Soccer. Añádelo a cada jugador e indica qué cerebro se usará.

En el script AgentSoccer, describimos la lógica de los jugadores. En el método anulado CollectObservations (), agregamos una lista de rayos que ayudará a los jugadores a monitorear y responder al juego.
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)); }
El método de AgentAction anulado es un análogo de Update. En él, llamamos al método de movimiento y distribuimos las recompensas.
public override void AgentAction(float[] vectorAction, string textAction) {
Si tocamos la pelota, empuja
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); } }
Restablecer comandos cuando se completa el objetivo
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(); }
Opciones de entrenamiento
Puede entrenar agentes desde el editor de la unidad, así como también usando
TensorFlow . En cuanto a la unidad, debes especificar el castigo y la recompensa para cada Cerebro en la Academia.

También vale la pena decirle a Brain su TypeBrain estableciendo el valor en Externo. También vienen en los siguientes tipos:
- Externo: donde se toman decisiones utilizando la API de Python. Aquí, las observaciones y recompensas generadas por Brain se redirigen a la API de Python a través de un comunicador externo. La API de Python luego devuelve la acción apropiada que el agente debe tomar.
- Interno: donde las decisiones se toman utilizando el modelo incorporado TensorFlow. El modelo anidado TensorFlow representa una política científica, y Brain usa directamente este modelo para determinar la acción de cada agente.
- Jugador: donde las decisiones se toman con teclado real o entrada de controlador. Aquí, el jugador humano controla al Agente, y las observaciones y recompensas recolectadas por el Cerebro no se usan para controlar al Agente.
- Heurística: donde las decisiones se toman con un comportamiento codificado. Esto es similar a cómo se define actualmente el comportamiento de la mayoría de los personajes y puede ser útil para depurar o comparar cómo un Agente con reglas codificadas se compara con un Agente cuyo comportamiento ha sido entrenado.