「ペルソナ3 リロード」(PC / PS5 / PS4 / Xbox Series X|S / Xbox One,以下,P3R)を自動でプレイし,不具合があったら報告してくれる。蓄積されたデータに基づいて,コミュやイベントなどその日に最適の行動を提案し,ドロップアイテムのコンプリートなど手間が掛かるテストもやってくれる。


 そんなQAの味方となるシステムについて語られたセッション「ペルソナ3 リロードでの自動プレイの実装と運用」が,「CEDEC2024」で行われたので紹介しよう。登壇したのはペルソナチームのチーフプログラマー,埜渡貴裕氏だ。

アトラス コンシューマソフトウェア局 第二プロダクションの埜渡貴裕氏



自動プレイの目的と仕組み


 ゲームの不具合を見つけるには,実際にプレイしてみるのが一番だ。しかし規模が大きいゲームになると,それも簡単ではない。とくにボリュームに定評のあるペルソナシリーズとなればなおさらだ。
 そこで生み出されたのが,このセッションで語られた「自動プレイ」だ。スクリプトで定められた動作をするのではなく,「ゲーム開始からエンディングまで」「ゲームシステムをある程度考慮したうえで」プレイしてくれるのが特徴である。
 労力のかかる膨大な繰り返しもなんのその,ごく限られた条件でしか起こらない不具合を見つけ出せる。P3Rは,この自動プレイを月に500時間以上を稼働させ,多くの不具合を発見したという。


 自動プレイは,埜渡氏が「ペルソナ5 ザ・ロイヤル」(以下,P5R)の開発終盤において,ゲームのボリュームが増えたことによるチェック工数の増加と,チェック漏れを懸念して生み出したステムだ。「P3R」の開発時には,2名のプログラマーがこれに携わり,これを実現したという。

 自動プレイの開発に求められたのは次の3点だ。

  1. 自動プレイを実現するために,ゲーム本編の開発を妨げない
  2. チェックの汎用性を確保する
  3. データや仕様の変更の影響を受けないようにする

 (1)は分かりやすいので,ここでは(2)と(3)について詳しく見ていこう。
 (2)の汎用性では,まず人間の手では見つけにくい不具合に対応するため,プレイ中にランダムなキー入力を行う――いわゆるモンキーテストに近いものを組み込んだという。これにより同じシーンであっても毎回違う動きをするようにし,特定のタイミングとキー入力の組み合わせで発生する不具合に対応しようという目論見である。
 とはいえ,この方式では複雑な手順を踏む行動は取りづらく,例えばメニューの深い階層などのチェックには向かないものとなる。これに対応するため,例えば指定したアイテムを指定したキャラクターに使うといった,恣意的な行動も行えるようにした。
 こうしてランダムな行動と決め打ちの行動を組み合わせ,汎用的なチェックを実現しているとのことだった。


 3)の仕様変更の影響を回避する仕組みとしては,極力データに依存しない仕組みにすることで,システムの柔軟性を確保することを心掛けたそうだ。
 例えば移動のために自動プレイ用のパスを用意することもできるが,それではマップに変更が加えられたとき,移動パスも引き直さなくてはならない。こうした工数を減らすためにも,どうしても対応が難しい場合を除いては,決め打ちにならない方法を選択したという。


 こうして開発された自動プレイシステムは,ほかの作品でも使用できるよう,プラグインやモジュールといった「パート」の組み合わせによって実現されている。これらのパートはそれぞれ取り外しができるため,製品版に自動プレイのコードが残ることもない。
 「P3R」の自動プレイは37のパートで構成されており,そのうちメニューやショップのUI操作用が30強ほど。なおパートにはそれぞれ優先度が設定されており,テキスト送りなど優先度が高いものから実行されていく仕組みになっているそうだ。



フィールドとバトルにおける動作


 ここからは,ゲーム中の各シーンにおける実装が,具体的に解説されていった。
 まずフィールドの移動については,先にも述べたとおり,本作の自動プレイはあくまでコントローラの入力をシミュレートする形で行われている。そのうえでランダムな入力を行うのだが,フィールドやバトルまでランダム入力に任せていると,一向に先に進めないことになる。このためゲームのルールに即した処理が組み込まれている。

 フィールドでは,まずコリジョン(衝突判定)を回避しつつ,イベントヒット(目的地)を検索しながら移動する方式になっている。そのうえで,移動の履歴は「ヒートマップ」として保存され,イベントヒットが見つからないときに利用される。ヒートマップに履歴がない場所=行ったことがない場所なので,そこを重点的に探せばイベントヒットを発見しやすいというわけだ。


 ここでゲーム開発に詳しい人なら,キャラクターの移動範囲を示すナビメッシュを使えばいいのでは……と思うかもしれない。実際,「P3R」では仲間や敵がプレイヤーを追尾するのにナビメッシュが用いられている。
 しかし,すべてのマップに設定されているわけではない。例えば,教室のシーンのナビメッシュは途切れ途切れなので,教室の後ろにはまっすぐ向かうことができない。そこで自動プレイではイベントヒット検索とヒートマップ,そしてナビメッシュを併用し,さまざまな状況に対応できるようにしたという。

ナビメッシュを使っての移動は,これが完備されたダンジョンなどでは可能(上画像)だが,そうでないマップでは使えない(下画像)。“自動プレイのための追加実装しない”がコンセプトなので,後者のマップではほかの方法を模索する必要がある

 バトルパートでは,ランダム操作だとすぐにゲームオーバーになってしまう。
 そうならないためにはキャラクターのレベルを高くする方法もあるが,それでは時間がかかってしまうので,動作のバリエーションを増やしつつ,勝率を上げるルール作りが行われた。回復を最優先にして,敵の弱点を突けるスキルを狙い,補助スキルによるバフ/デバフを盛っていく。そうした状況判断を行うようにして,バトルがスムーズに進行するようにしている。


 さらに「メニューを開く」「アイテムAを選ぶ」といった,ある程度複雑な操作を「コマンド」としてまとめ,このコマンドを行動の単位として自動化を進めたという。なお人間の操作をコマンドとして記憶し,繰り返させるような機能も用意されたが,プログラムの知識がない人には使いにくいものだったので,残念ながらあまり活用されなかったそうだ。



「おすすめ行動サーバー」による最適化


 さて,こうして自動化によって日々プレイされた記録は,ログとしてサーバーに送信され,蓄積されていった。このログには移動したマップや敵パーティ構成,使用したスキル,再生したイベントなど,かなり多くの項目が含まれており,見やすい形でHTMLに出力することもできた。これによって「仕様で想定していない日にイベントが起きていないか」「敵AIが想定外の動作をしていないか」などを確認するわけだ。


 これを活用して生まれたのが「おすすめ行動サーバー」だ。これは蓄積されたログからゲームをスムーズに進められる“おすすめ行動”を抽出し,自動プレイにコマンドとして送信するシステムであり,自動プレイがおすすめ行動サーバーに問い合わせると,サーバーは以前のログを参照し,効率的な行動を指示する仕組みになっている。
 例えば日常パートであれば,低いコミュランクや人間パラメータを上げる行動が優先され,そのために必要なイベントヒットまでの経路や,ポイントを一番多くもらえる選択肢を実行するコマンドが自動プレイに送られる。さらにはコミュの解禁に必要なアイテムがあるなら取りに行き,ダンジョンの失踪者を救出し,シャッフルタイムで取ったことのないペルソナを優先するなど,かなり複雑な状況判断が行っている。

 こうした行動指示は,蓄積された自動プレイのログ(=実際に可能だった行動)から決定されており,ゲーム側のテーブルやスクリプトなどを解析しているわけではない。あくまでゲーム外の処理であるため,データが凍結された時期であっても,自動プレイ自体の調整は可能なのも強みだという。


 コマンドの組み合わせによって,これまで手作業だった確認作業も自動化できるようになった。例えばダンジョンの宝箱を開けつつフロアを登っていったり,シャッフルタイムでカードを引き続けたり,全種類のスキル変化を確認したりといった,結果がランダムなものを自動化することで,QAの工数が削減できた。

 例えばシャッフルタイムでは,「敵を倒す→カードを確認」というループは1回12秒で終わるものの,登場するカードが500種類あるうえに,出現したカードがすでに出ているかどうかを判断しなくてはならない。人間がやるには大変だが,自動プレイなら完全に任せてしまえるうえにミスも起こらない。それでも全パターンの検証に15時間かかったそうだが。
 ちなみに,これを人の手でやるとなると約60人日かかるという。60人日が15時間になったのだから,その効果はかなりのものである。


 一方で,「P3R」における自動プレイの実装と運用には,合わせて約300人日がかかっている。基本部分は「P5R」のものが流用できたが,コマンド部分の実装は初の試みだったため,時間が必要だったのだそうだ。だが,その結果として月に500時間以上の自動プレイが可能となり,ランダム操作しながら「P3R」を1周プレイするのに,120〜150時間というところまでチューナップできた。

 なお見つかった不具合は重複込みで412件あり,うちS/Aランク(進行不能バグ)は168件。「P5R」ではS/Aランクが693件あったことを考えると,α期間から自動プレイを運用した成果は十分にあったといえる。全体で考えると,300人日は工数が削減できたことになり,氏はこれをかなりの成果と喜んでいた。


自動プレイが発見した人の手では見つけにくいバグの一例として,「追尾していた仲間に話しかけたが,会話が始まらずに進行不能となる」というものが紹介された。細い隙間で主人公を振り返らせすぐに話しかけると,仲間との距離が取れず会話が始まらない……というかなりレアな条件で,氏は「自動プレイが引き当ててくれて本当に良かった」と話していた

 埜渡氏は今後の展望として,軽微な不具合の検出や,おすすめ行動サーバーのバリエーション増加などに取り組んでいきたいと語り,講演を締めくくった。

 周回を重ねるたびに知識が蓄積され,有利になる……というのは,それこそRPGを繰り返し遊ぶ楽しさの一つでもある。そうして蓄積された知識を持ち寄って,ゲームを攻略していくのもまた,近年のゲームの楽しみ方の一つと言える。
 なお,氏はおすすめ行動サーバーを使った強化学習で,作中最強のボスを倒すという検証も行ったそうで,これにより平均勝率30%超を達成できたとのこと。QAを自動化する過程で生まれたシステムが,結果として人間と同じことをしているのも興味深い。ここから何か別の使い道が生まれそうな気もするのだが……ともあれ今後のさらなる発展に期待したいところだ。


鄭重声明:本文の著作権は原作者に帰属します。記事の転載は情報の伝達のみを目的としており、投資の助言を構成するものではありません。もし侵害行為があれば、すぐにご連絡ください。修正または削除いたします。ありがとうございます。