メインコンテンツまでスキップ

バトルAI

MCE はバトルAIにプラガブルなストラテジーパターンを使用しています。AIシステムは BattleAI 基底クラスと、異なる難易度レベルや行動スタイルを作成するために組み合わせ可能な BattleAction コンポーネントのコレクションで構築されています。

アーキテクチャ

AIパイプラインは2つのレイヤーで動作します:

  1. BattleAI -- 現在のバトル状態を受け取り、BattleAction を返すエントリポイント。
  2. BattleAction コンポーネント -- バトルの1つの側面を評価する個別の意思決定ユニット(例:「効果抜群の技を使うべきか?」や「耐性のあるモンスターに交代すべきか?」)。

BattleAI インスタンスは順序付けられた BattleAction コンポーネントのリストを保持します。優先順位順に評価し、有効なアクションを生成した最初のものが採用されます。

組み込みAIストラテジー

MCE には組み合わせ可能な複数のAIストラテジーが同梱されています:

RandomBattleAI

最もシンプルなAI。毎ターンランダムに有効な技を選びます。

  • 難易度:非常に簡単
  • 用途:野生エンカウント、序盤のトレーナー
  • 動作:利用可能な技からランダムに選択。戦略的思考なし。

PerformEffectiveMove

現在のターゲットに対して最も効果的なダメージを与える技を選びます。

  • 難易度:中程度
  • 用途:中盤のトレーナー、ジムリーダー
  • 動作:各利用可能な技のタイプ相性を計算し、最良のものを選択。ステータス変化や変化技は考慮しない。

PerformRandomMove

RandomBattleAI に似ていますが、重み付きの技選択を行います。

  • 難易度:簡単
  • 用途:低レベルトレーナー
  • 動作:ランダムに技を選択しますが、変化技よりも攻撃技をわずかに優先。

組み込みアクションコンポーネント

これらのコンポーネントを組み合わせてカスタムAIストラテジーを作成できます:

コンポーネント説明
PerformEffectiveMove最も効果的なタイプ相性の技を使用
PerformRandomMoveランダムな技を使用
MegaOrGigaIfCan可能ならメガシンカまたはキョダイマックスを発動
SwitchToEffectiveMonsterタイプ相性で有利なパーティメンバーに交代
UseBattleItemsHPが低い時に回復や状態異常回復アイテムを使用
IfWildWithRunChanceRun野生モンスターが逃走を試みる可能性

トレーナーごとのAI設定

各トレーナーNPCに異なるAI設定を適用できます:

  1. トレーナーの Actor またはエンカウントデータで、AI Configuration フィールドを見つけます。
  2. BattleAI ScriptableObject を割り当てます。
  3. アクションコンポーネントのリストと優先順位を設定します。

設定例:

簡単なトレーナー(ルート1)

1. PerformRandomMove

中程度のトレーナー(ジムパズル)

1. MegaOrGigaIfCan
2. PerformEffectiveMove
3. PerformRandomMove(フォールバック)

強いトレーナー(チャンピオン)

1. MegaOrGigaIfCan
2. SwitchToEffectiveMonster(不利な時)
3. UseBattleItems(HP < 25% の時)
4. PerformEffectiveMove
5. PerformRandomMove(フォールバック)

IBattleAI インターフェース

DLLティアのユーザーは、BattleAI 基底クラスを通じてAIシステムにアクセスします。ソースコードなしでは内部実装を変更できませんが、以下は可能です:

  1. エディタで新しい BattleAI ScriptableObject を作成。
  2. Inspector でアクションコンポーネントのリストを設定。
  3. トレーナーに割り当て。

主要インターフェース:

public abstract class BattleAI : ScriptableObject
{
// 順番に評価される BattleAction コンポーネントのリスト
public List<BattleAction> Actions;
}

public abstract class BattleAction : ScriptableObject
{
// このアクションを実行すべきかを評価
// 適用されない場合は null を返す
public abstract BattleActionResult Evaluate(BattleContext context);
}

ML-Agents 統合

MCE には高度な難易度向けの実験的な ML-Agents ベースAIが含まれています:

MLBattleAI

Unity ML-Agents を使用して、訓練済みニューラルネットワークに基づいて判断を行います。

  • 難易度:可変(訓練に依存)
  • 用途:終盤のトレーナー、競技AI、研究
  • セットアップ:ML-Agents パッケージと訓練済みモデルが必要

AIの訓練

  1. ML-Agents の依存関係をインストール:.\MLAgentsInstall.ps1
  2. MLAgentsConfig/OpenMonAgent.yaml で訓練パラメータを設定
  3. 訓練を開始:.\RunMLTraining.ps1
  4. TensorBoard で監視:.\ViewMLResults.ps1
  5. 訓練済みモデル(.onnx ファイル)をエクスポート
  6. MLBattleAI コンポーネントにモデルを割り当て

MCEBattleAgent クラスが観測空間とアクション空間を定義します:

観測(AIが見るもの):

  • 自分のモンスターのHP%、タイプ、ステータス段階、状態異常。
  • 相手のモンスターのHP%、タイプ、ステータス段階、状態異常。
  • 利用可能な技とそのタイプ。
  • パーティ状態(残りモンスター数、HP%)。

アクション(AIが実行できること):

  • 技1-4を使用。
  • パーティメンバー1-5に交代。
  • アイテムを使用。
ML-Agents の依存関係

ML-Agents は独自の Python 依存関係を持つ別パッケージです。コアの MCE バトルシステムは ML-Agents なしで動作します。ニューラルネットワークベースのAIを使用する場合にのみインストールしてください。

カスタムAIの作成(Source ティア)

ソースコードにアクセスできる場合、まったく新しいAIストラテジーを作成できます:

カスタム BattleAction

[CreateAssetMenu(menuName = "OpenMon/AI/Actions/Use Status Move If No Status")]
public class UseStatusMoveIfNoStatus : BattleAction
{
public override BattleActionResult Evaluate(BattleContext context)
{
// 相手に状態異常がないかチェック
if (context.OpponentBattler.StatusCondition != StatusCondition.None)
return null; // このアクションをスキップ

// 状態異常を付与する技を探す
foreach (var moveSlot in context.OwnBattler.MoveSlots)
{
if (moveSlot.Move.Category == MoveCategory.Status
&& moveSlot.CurrentPP > 0
&& moveSlot.Move.InflictsStatus)
{
return new BattleActionResult
{
ActionType = BattleActionType.UseMove,
MoveIndex = moveSlot.Index
};
}
}

return null; // 該当する変化技が見つからない
}
}

カスタム BattleAI

[CreateAssetMenu(menuName = "OpenMon/AI/Strategies/Expert AI")]
public class ExpertBattleAI : BattleAI
{
// 必要に応じて意思決定パイプラインをオーバーライド
public override BattleActionResult DecideAction(BattleContext context)
{
// 単純なアクション合成を超えたカスタムロジック
// 例:先読み予測、チームシナジー分析
return base.DecideAction(context);
}
}

AI難易度ガイドライン

難易度AIコンポーネント使用場所
非常に簡単ランダム技のみ野生エンカウント
簡単重み付きランダム技序盤のルート、虫とりトレーナー
中程度タイプ相性を考慮ジムトレーナー、ライバル
難しい相性 + 交代 + アイテムジムリーダー、四天王
エキスパート全コンポーネント + 予測チャンピオン、クリア後
ニューラルML訓練済みモデル競技、チャレンジモード

ベストプラクティス

  1. AIを物語の文脈に合わせましょう。ランダムな虫とりトレーナーがチャンピオンのようにプレイすべきではありません。
  2. 同レベル帯のプレイヤーチームに対してAIをテストしましょう。バランスの悪いAIは不公平に感じます。
  3. アクションコンポーネントパターンを使用しましょう。モノリシックなAIスクリプトより保守しやすいです。
  4. フォールバックを用意しましょう。AIが行動不能にならないよう、最後のアクションには常に PerformRandomMove を含めてください。
  5. 序盤のトレーナーのAIを過度に最適化しないでください。プレイヤーは賢い相手に直面する前にシステムを学ぶ必要があります。