Unity3d、エージェント、タンチキ

画像



すべての人に良い一日を!



大学の上級コースでも、知的エージェントに関わるようになりました。 卒業証書のトピックでさえ、もともと戦場を模した環境での敵対行為に関与するエージェントの作成に関連付けられていました。 しかし、仕事のために、私は主題を変えなければなりませんでした。



私は長い間これをやりたいと思っていましたが、すべての時間がなくなっていました。 今、彼らはようやくエージェントのための環境を作り始めましたが、そのような規模ではありません。 だから誰かが興味を持っているなら、参加してください! リポジトリが開いています、下のリンク。



インテリジェントエージェント。


簡単に言えば、エージェントは環境に配置されたエンティティであり、センサーを使用して環境を認識し、アクチュエータを使用して環境に作用することができます。



ウィキペディアによると、最も単純なエージェントスキームは次のようになります。



画像



そのようなエージェントには理由はなく、単純なif-thenルールのリストに従って排他的に動作します。 より複雑なエージェントには、アクションを分析して学習できるタイプがいくつかあります。 しかし、私はまだ彼らから遠いです。



Unity3d


Unity3dで、戦場(正方形)といくつかの戦車を持つプロジェクトを作成しました。 古き良きバトルシティゲームから戦車のテクスチャを取りました。 各戦車ができることは、フィールドを駆け抜けて撃つことです。

これは、プロジェクト全体の外観です。



画像



各タンクには2つの制御スクリプトが添付されています。

-TankBehavior

-BasicTankControls(またはそのサブクラス)



TankBehaviorは、1つの戦車を完全に記述するメインスクリプトです。 このスクリプトは、移動、射撃、その他すべての方法を実装しています。 このスクリプトには、タンク制御を実装するBasicTankControlsへのリンクも含まれています。 基本的なスクリプトは次のようになります。



public class BasicTankControls : MonoBehaviour { public void Init(TankBehavior tank) { this.tank = tank; } public virtual void Act(List<TankData> tanksData) { // no operation } protected TankBehavior tank; }
      
      







これにより、TankBehaviorスクリプト内の制御スクリプトが初期化されます。



 void Start () { ... controls = GetComponent<BasicTankControls>(); if(controls != null) { controls.Init(this); } ... }
      
      







このメソッドは物理ティックごとに呼び出されます。



 void FixedUpdate() { if(controls != null) { GameObject[] tankObjects = GameObject.FindGameObjectsWithTag("Tank"); List<TankData> tanksData = new List<TankData>(); foreach (var item in tankObjects) { if (item.GetInstanceID() != this.GetInstanceID()) { tanksData.Add(item.GetComponent<TankBehavior>().GetData()); } } controls.Act(tanksData); } }
      
      







最初に、フィールド上のすべてのタンクに関するデータが収集されます。 したがって、エージェントセンサーによる環境に関する情報の収集がシミュレートされます。 次に、この情報は制御スクリプトに送信されます。制御スクリプトは、受信したデータに基づいて、環境に影響を与えます。

1つの戦車のデータは次のようになります。



 public class TankData { public TankData(int instanceId, Vector2 position, float health, Direction direction) { this.InstanceID = instanceId; this.Position = position; this.Health = health; this.Direction = direction; } public readonly int InstanceID; public readonly Vector2 Position; public readonly float Health; public readonly Direction Direction; }
      
      







それは基本的にそれです。 ここでのタスクは、戦車の制御スクリプトを作成することだけです。 誰かがイベントの途中で突然介入したい場合に、人を管理するためのスクリプトを1つ書きました。



 public class HumanControls : BasicTankControls { public override void Act(List<TankData> tanksData) { if(Input.GetButton("Up")) { tank.MoveForward(); } else if (Input.GetButton("Down")) { tank.MoveBackward(); } if (Input.GetButtonDown("Left")) { tank.RotateLeft(); } else if (Input.GetButtonDown("Right")) { tank.RotateRight(); } if (Input.GetButton("Fire")) { tank.Fire(); } } }
      
      





タンクの挙動


そもそも、単純な自律行動、たとえば、ランダムな方向への運転や射撃を計画しています。 次に、壁(取り壊されるかもしれません)とまさに本部を追加するというアイデアがあります。一部は保護する必要があり、他は破壊する必要があります。 多分、共同行動計画さえあるでしょう。

しかし、これらは非常に楽観的な計画です。 私自身もこれを書いたことがないので、勉強しなければなりません。 どんな助けやアドバイスも大歓迎です! :)



リポジトリへのリンク



All Articles