UnityとゲームAIと将棋

Unity、Pythonを中心にゲーム開発やゲームAI開発の技術メモ等、たまに将棋も

【Unity】MLAgentsでターン制ゲームのAIを実装する時の行動決定方法

結論

RequestDecisionメソッドを使用する

詳細

Unity MLAgentsで自作ゲームのAIを実装する際に、サンプルの実装を参考にすると思いますが、サンプルゲームにはリアルタイム性の強いものが多く、ほとんどが下記の画像ようにDecisionRequesterのコンポーネントを利用して毎ステップ行動決定を要求するという実装になっています。

DecisionRequester

そのため、ターン制ゲームでの対戦AIを実装するためにはどうしたらいいのか悩んで調べた内容をメモとして残しておきます。

結論としてはRequestDecisionメソッドを利用します。 ターン管理の仕組みの中で何らかの行動選択をさせたいという部分でRequestDecision()を呼びます。 これによりMLAgents内の行動と行動後の処理が実行されます。以下はサンプルコードです。

        private async UniTask DoMLAgentsAction()
        {
                mlAgent.RequestDecision();
                await UniTask.WaitWhile(() => mlAgent.selectedAction == null);

                // 取得した行動を盤面に反映する何らかの処理

                mlAgent.selectedAction = null;
        }

ここで、MLAgentsによる行動決定をUniTask化して待機している理由はRequestDecisionが呼ばれたタイミングによってはOnActionRecievedが適切に動作せず、インデックスとして0しか返って来なくなることがあるためです。なので、Agentクラスを継承したクラス内にselectedActionという変数を用意して正しく行動が選択されるまで待機するという方法で実装しています。