代替ボット
イントロダクション
AIでのプレイヤーのキャラクター操作は、以下の2つの状況で活用の場面が多くあります:
マッチング中にゲームから切断されたプレイヤーを代替する場合。これはプレイヤーが再接続を試みる間、ボットが助けることができるため、より公平なマッチを作成するのに役立ちます。また、レイジクイットしたプレイヤーを代替する場合にも役立ちます。
ゲームセッションを開始するのに必要な最小限のプレイヤー数に達していない際に、ルームを偽のプレイヤーで満たす場合。これは、ゲームのリリースサイクルの初期段階で、プレイヤーベースが小さい場合に特に重要です。
設定
Quantumでは、こういった機能のAIロジックは各クライアントのマシンによって実行されます。つまり、「ボットの入力をシミュレートするマスタークライアント」という概念は存在しないのです。
通常、ゲームエンティティを制御するAIの実行は簡単ですが、実行はゲームに特化した内容となります。もちろん、AI実装の複雑性自体は非常に簡単なものから、非常に複雑なものまであります。
最も簡単な方法は、あるエンティティが現時点ではAIによって制御されているかどうかを示すことです。これはさまざまな方法で実現できます:
component AI {}
のような「フラグコンポーネント」を追加する。このフラグは、必要に応じてエンティティに追加/削除されます。システムはAIコンポーネントを持つすべてのエンティティを繰り返し処理し、制御ロジックを実行することができます。- コンポーネントでブール値を使用し、AI制御をオン/オフすることができます。
- Bot SDKのエージェントコンポーネントやカスタムコンポーネントのように、多くの追加データを持つAI専用コンポーネントを追加する。
それでは、いつ実行するべきでしょうか?それは、上記の2つのケースのどちらを選ぶかによって決まります。以下のセクションで、詳しく説明します。
ゲームマッチ中に実際のプレイヤーを代替する
これはPlayerConnectedSystem
をアクティブにして、ISignalOnPlayerConnected
とISignalOnPlayerDisconnected
のシグナルをリッスンすることで実現できます。このシステムと、付随するシグナルについてはプレイヤーのドキュメント で説明されています。
プレイヤーが切断したら、そのプレイヤーが制御するエンティティを見つけ、上記の説明に従ってそれらのAIをセットアップしてください。
プレイヤーが再接続したら、プレイヤーが制御していたエンティティがあるかどうか確認し、AI設定を削除してプレイヤーがAIから制御を取り戻すようにします。
なお、上記のシステムはPlayerInputFlags
を使って動作していますが、これはPlayerConnectedSystem
とは別に使用することもできます。プレイヤー入力フラグについての詳細はこちらを参照してください。
ルームをボットで満たす
この場合、実際のプレーヤーは関与していません。つまり、実際の人間によって制御されることを意図していないエンティティが作成されます。
プレーヤーが存在しないので、接続ロジックも必要ありません。このサンプルアルゴリズム/スニペットのように、カスタムゲームロジックによってルームをエンティティで満たすことができます:
- Quantumシステムでは、ゲーム開始後にプレイヤーが接続し、プレイヤーデータを送信するため、一定時間待ちます。
- プレイヤーが到着したら、
OnPlayerDataSet
コールバックを使用して、接続に成功してゲームに参加したプレイヤーの数をゲームステート(例:frame.Globalの変数)に保存します。 - インターバルの後、この数をフレームAPIから得た予想プレイヤー数から以下のように減算します:
int fillAmount = frame.PlayerCount - frame.Global->ConnectedPlayersCount;` のようにします。 - この結果を使用して、ボットエンティティを作成するための
for
ループを実行します:
C#
for(int i = 0; i < fillAmount; i++)
{
// Create a new Entity here
// Setup it as a Bot as explained earlier on this document
}
上記のスニペットは非常に単純なので、ゲームや設計の要件に合わせて調整する必要があります。たとえば、偽のプレイヤー情報やチームデータなどのボットエンティティに、特殊な情報を割り当てるのに役立つ場合があります。
作成するボットを選択する
ゲームの種類によっては、既知のデータに基づいて新しいボットを作成すると便利な場合があります。たとえば、まだ選ばれていないキャラクターや、様々な難易度のボットを選ぶことができます。
ヒント: RuntimeConfig
アセットは、エンティティ プロトタイプ (すなわち AssetRefEntityPrototype
) への参照を保持することができるので、そこから選択するキャラクターのプールが存在することができます。または、1つのタイプのキャラクターを、様々なAIアセットで制御することもできます(例:難易度によって異なるステートマシン)。
プレイヤーとボットのアーキテクチャ
キャラクターはQuantumシステムによって制御されます。これらのシステムは通常、プレイヤーの入力を読み取り、キャラクターの移動、回転、攻撃のトリガーなど、ゲームステートを変化させる方法を知っています。
これらと同じキャラクターをAIロジックで制御するには、複数の方法があります。以下は、通常は円滑に作動するコードアーキテクチャのサンプルです:
プレイヤーは当然のことながらInputを持っています。このInputは
frame.GetPlayerInput(playerIndex)
でポーリングすることができ、Input
型の構造体へのポインタを返します。ボットも、カスタムコンポーネント内に同じ構造体-
component Bot { Input Input }
-を持てます。 AIロジック自体は、この構造体内のデータを埋めるためだけに使用される可能性があります。どのキャラクターシステムを実行するよりも前に、入力データを埋めます。こうすることで、誰が入力するかに関わらず、システムが入力を受け取る方法を知っていれば、そのエンティティがプレイヤーなのかボットなのかをシステムで追加で確認する必要はなくなります。
つまり、AIシステムはエンティティの状態に直接影響を与えることは(ほとんど)なく、むしろその判断にもとづいて偽の入力を生成します。
このアーキテクチャを使用する利点は、分離されたシステムを提供することで、入力 | プレイヤーとボット | キャラクターを明確に分離することです。
これは、単なる提案である点に留意してください。このアーキテクチャは必須というわけではありませんし、既存のゲームデザインやコードアーキテクチャにもっとも適切な方法によって、同じ成果を得ることが可能です。
以下は、Twin Stick Shooterサンプルにこの方法を適用した場合の例です:
注意: Twin Stick Shooterサンプルは__上級者向けの__サンプルです。このため、このサンプルの分析にはQuantumの基礎を理解していることが必須となります。
Bot SDKをともなうAI
プロジェクトへのAI活用を検討しはじめた場合には、QuantumのBot SDKを参照したいかもしれません。Bot SDKは、State Machine、Behaviour TreeなどのAIエージェントの作成をサポートするエディターツールとQuantumコードのセットです。
Bot SDKについて、詳細はこちらを参照してください。
Back to top