Plus récemment, le plugin ml-agents a été mis à jour. Pour ceux qui ne le savent pas, il s'agit d'un plugin open source qui est un environnement pour former les agents à l'unité. Ils peuvent être formés à l'aide de l'apprentissage par renforcement, de l'imitation, de la neuroévolution ou d'autres méthodes d'apprentissage automatique à l'aide de l'API Python. Il fournit également un certain nombre d'algorithmes modernes (basés sur TensorSlow) qui vous permettent de créer des PNJ plus intelligents pour vos jeux.
De quoi avez-vous besoin pour implémenter l'apprentissage automatique dans Unity?
Téléchargez ce plugin
ici . Vous aurez besoin du dossier unité-environnement. Avant cela, créez un projet vide. Dans le dossier Assets, ajoutez le contenu du dossier Assets avec unity-envonment. Pour ce faire, avec ProjectSettings. Veuillez noter que si vous ajoutez ce plugin à un projet existant, créez d'abord un projet vide, suivez les étapes ci-dessus et créez un package (Assets-ExportPackage), puis importez-le simplement dans votre projet existant. Cela est nécessaire pour que vous ne perdiez pas les paramètres ProjectSettings existants dans votre projet.
Je vais démontrer l'implémentation du machine learning en utilisant l'exemple d'un match de foot (cette scène est déjà dans le plugin). Il a deux équipes, bleu et rouge. Chaque équipe a un attaquant et un gardien de but.
Revenons au plugin lui-même. Pour qu'il puisse travailler sur scène, nous avons besoin d'au moins un objet Académie, Cerveau et Agent. Le schéma d'interaction peut être vu ci-dessous.

L'objet Academy et ses filiales GoalieBrain, StrikerBrain sont situés sur la scène. Comme nous pouvons le voir sur le schéma, chaque Académie peut avoir plusieurs Cerveau, mais chaque Cerveau doit avoir une Académie.
Agent - ce sont nos objets de jeu que nous voulons entraîner.

Ensuite, allez au code. La classe SoccerAcademy, qui a été ajoutée à GameObject Academy, est héritée de la classe Academy, avant cela, vous devez ajouter un espace de noms à l'aide de MLAgents. Après cela, nous devons remplacer les méthodes
public override void AcademyReset() { } public override void AcademyStep() { }
Et ajouter des liens vers créés par Brain
public Brain brainStriker; public Brain brainGoalie;
Ajouter un composant Brain à GoalieBrain, StrikerBrain et les affecter à Academy

La classe AgentSoccer hérite de Soccer. Ajoutez-le à chaque joueur et indiquez quel cerveau sera utilisé.

Dans le script AgentSoccer, nous décrivons la logique des joueurs. Dans la méthode surchargée CollectObservations (), nous ajoutons une liste de rayons qui aideront les joueurs à surveiller et à répondre au gameplay.
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)); }
La méthode AgentAction substituée est un analogue de Update. Dans ce document, nous appelons la méthode de déplacement et distribuons les récompenses.
public override void AgentAction(float[] vectorAction, string textAction) {
Si nous touchons le ballon, poussez-le
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); } }
Réinitialiser les commandes lorsque l'objectif est terminé
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(); }
Options de formation
Vous pouvez former des agents à partir de l'éditeur d'unité, ainsi qu'en utilisant
TensorFlow . Quant à l'unité, vous devez spécifier la punition et la récompense pour chaque cerveau de l'Académie.

Il est également utile d'indiquer à Brain son TypeBrain en définissant la valeur sur External. Ils viennent également dans les types suivants:
- Externe - où les décisions sont prises à l'aide de l'API Python. Ici, les observations et les récompenses générées par Brain sont redirigées vers l'API Python via un communicateur externe. L'API Python renvoie ensuite l'action appropriée que l'agent doit entreprendre.
- Interne - où les décisions sont prises à l'aide du modèle TensorFlow intégré. Le modèle TensorFlow imbriqué représente une politique scientifique et Brain utilise directement ce modèle pour déterminer l'action pour chaque agent.
- Joueur - où les décisions sont prises à l'aide d'une véritable entrée de clavier ou de contrôleur Ici, le joueur humain contrôle l'agent, et les observations et récompenses collectées par le cerveau ne sont pas utilisées pour contrôler l'agent.
- Heuristique - où les décisions sont prises en utilisant un comportement codé en dur. Ceci est similaire à la façon dont la plupart des comportements des personnages sont actuellement définis et peut être utile pour déboguer ou comparer la façon dont un agent avec des règles codées en dur se compare à un agent dont le comportement a été formé.