ごあいさつ
初めまして、株式会社アトラスのプログラマー埜渡です。
Tech BLOGにお邪魔させていただきます。
今回は、弊社のタイトル「ペルソナ5 ザ・ロイヤル」(P5R)の開発中に、自動プレイを実装してバグの検出を行った経緯とその結果についてのお話をさせていただきます。
ゲーム本編の実装についてのノウハウというよりは、デバッグ作業での工夫についての内容になります。
ただ、触れる内容といたしましてはP5Rのゲームの中身に関する事が多いため、未プレイの方はプレイしてから読んでいただけると、より理解が深められると思います。
自動プレイ実装のきっかけ
自分が入社した頃の一昔前のバグの検出といえば(現象発生時の記録を残すために)開発機をビデオデッキに繋ぎながらプレイをして、発見したら詳細な手順をバグシート(紙)に書いて報告をしているような方法でした。
最近では開発環境自体に録画機能が備えてあったり、バグ報告もWebベースでチケット管理したりとだいぶ環境が変わってきました。
報告方法が変わってきただけでなく、検出方法も人が何時間も粘ってプレイして出す方法から、機械的にテストできるものは自動化をするような動きに変わってきています。
弊社タイトルのP5Rは平均プレイ時間がおよそ100時間ほどとなっており、勤勉に日々の業務時間フルにプレイしても、クリアまでに3週間近くかかってしまう計算になります。
そんなことも背景にあったため、なんとかして少しでもプレイして確認する時間を増やしたい、できればエンディングまで通しで確認できる仕組みを作りたいという考えから人手を介さずともゲーム本編のテストをしてくれるような自動プレイを実装しようと思い立ちました。
自動プレイを実装するにあたって
自動プレイを実装するにあたって、いくつか問題となる事がありました。
- 専用の作業時間を用意していなかったため、他の人に作業をお願いはできない
- 同様の理由で自動プレイ自体の調整・修正作業に多くの時間は費やせない
1.についてですが、例えばプランナーやデザイナーに自動プレイ用に何かを対応作業をしてほしいというお願いをしようにも、そもそもの担当箇所の実装や調整作業で手一杯なため、追加の作業はお願いできないという状況にありました。
2.についても、自分自身が日常・ダンジョンパート(プレイヤーを操作して自由に移動するパート)という担当箇所を持っていたため、自動プレイの実装をした後にプランナーやデザイナーの仕様変更に合わせた調整をするための時間が十分にあるわけではありませんでした。
そんな事もあり、実装する仕組みとしては
- データ作成の時間が無いため、自動プレイのための専用データはなるべく用意しない
- 細かい対応する時間が無いため、仕様変更や調整に対応できるような仕組みでの実装を試みる
このようなコンセプトを持って、自動プレイの実装作業を開始しました。
また、実装の目標として
- 人手を介さずとも、ゲーム開始からエンディングまで自動でプレイできる
- ランダム要素を増やしなるべく多くの箇所をチェックできるようにする
こちらを達成できるようなものを目指し作成を開始しました。
実装してみたもの
実装内容の説明の前にゲームのシステムを軽く説明させていただきます。
ペルソナシリーズの特徴的なシステムとして、カレンダーシステムがあります。
こちらはゲーム内1年間の日々を過ごす事でゲームが進行していく仕組みになっています。
極端な話ですと、毎日家に帰って寝るだけの自堕落な生活をしていてもエンディングへ近づく事はできます。
・・・が、流石にそれだけでゲームが進行するはずもなく、一定期間にダンジョンをクリアしてボスを倒すようなことはゲームクリアするために必要となります。
また、ただ寝るだけの生活ではバグの検出としては不十分なのでなるべく色々なイベントを発生させるようにもしたいという考えがありました。そのためには自室のベットへまっしぐら・・・ではなく様々な場所へ移動するための仕組みが必要となります。
ここで問題となったのが、どのようにしてプレイヤーキャラを目的地に移動させてゲームを進行させていくかです。
ゲームを進行させるというのは、ダンジョンパートであればギミックを解除しボスの元までたどり着く、日常パートであればNPCに話しかけてイベントを発生させたり、バッティングセンターに通ったりすることになります。
こういったイベントをこなしていくことで、ゲームオーバーになることなく日付が進行しエンディングを迎えることができます。
次に目的地へ移動する仕組みについてですが、真っ先に思いたものは人がプレイしたデータをリプレイまたはそのような操作をツール上で指定するといったものでした。
ただ、今回は先の「データ作成の時間が無いため、自動プレイのための専用データはなるべく用意しない」という事情もあり、実装することはできませんでした。
そのため専用データを必要としない、ルールベースの移動システムを実装することにしました。
ルールベースの実装基本方針として、付近のイベントヒットを探索し起動するという仕組みを実装しました。
ここでいうイベントヒットとは、ゲーム中アクセスすることでイベントが発生するような範囲のことを指します。
- NPCとのTalkヒット
- 宝箱や扉のCheckヒット
- エリア移動を行うGotoヒット
- …etc
こちらを目標地点として移動することで、闇雲に移動するのではなく先述のゲームを進行させるイベントを発生するために移動することができます。
本実装ではプレイヤーキャラクターの前方範囲を中心に、直線距離で障害物に阻まれることなくたどり着けるものをランダムで検索しそちらを目標地点として移動させました。(画面写真プレイヤー前方の扇形範囲)
ただ、こちらだけでは付近にイベントヒットがない場合には移動に困ったためもう一つのルールを実装しました。
もう一つのルールはヒートマップ(時限制の徘徊履歴)になります。(画面写真の赤いラインのブロック)
歩き回ったプレイヤーの周囲(本作では100cm立方のブロック)に時間経過でクリアされる徘徊履歴をつけることで、ヒートマップがない場所=(少なくとも直近では)あるきまわっていない場所というルールができました。
こちらのルールを追加することで、イベントヒットが検索で見つからなかった場合には、付近のヒートマップが配置されていない場所(ブロック)を移動目標にすることで、未踏破部分を目指して歩き回ることができるようになりました。
蛇行した通路でも引っかかることなく、ヒートマップの存在しない未踏破部分へ移動し、イベントヒットを見つけた際には移動して調べる動作をしていることがわかると思います。
未踏破部分には今まで調べたことのないイベントヒットがある可能性が高く、そちらのイベントヒットにアクセスすることで、新たな未踏破エリアが増え、さらなる未踏破部分へと移動というループができ、より広く、より先の範囲を自動で移動できるようになりました。
その他にも細かい調整はしたものの、大きくは先の2つの移動ルールでエリア内の未踏破部分を歩き回り、発見したイベントヒットを調べることができたため最終的にはダンジョンのボスまで到達することができました。
これまでの仕組みを実装したことで、日常パートではダンジョン最奥部のような目指す目的地は無いものの、同様のルールで様々なNPCや施設にアクセスするため、各種イベントを発生することができるようになりました。
ここまで実装できれば、プレイヤーキャラの移動箇所以外(バトルパートやイベントパートなど)はランダム入力でもなんとかゲームが進行ができ、最終的にはエンディングへ到達することができるようになりました。
自動プレイで目的地として使用しているイベントヒットは、ゲーム内で使用するためのデータだったため追加のデータを必要とすることが(ほとんど)なく、ゲーム本編での調整による修正にも強いものとして実装することができました。
そのため開発中盤~マスターの直前あたりからは手の空いた筐体(退社時など)を利用して自動プレイを回すようにしていましたが、各種の調整作業が有ったとしても自動プレイ自体の調整は殆どせずに稼働させておくことができました。
運用した結果
今回実装した自動プレイでは、主にハングアップや進行不能となるような不具合の検出に重点を置いてチェックを行いました。
その結果として、上記のような最重要修正ランクバグの報告数のうち5%程は自動プレイで検出することができました。
割合としてはちょっと少ないかなという印象かもしれませんが、こちらはバグチケットとして記録が残っているものに限っているため、報告が残っていない開発中盤時から発見できた不具合などを含めるともう少し多い割合貢献できていたと思います。
また自動プレイで検出できたバグは、人手で再現するのが難しいようなタイミングや方法でのものが多く、こちらが予想できないようなバグを発見することができたのも大きな収穫となりました。
- バトルの特定タイミングでラッシュをすると進行不能
- システムセーブ中にデータロードでハングアップ
- 特定の手順とタイミングでペルソナ合体を行うとハングアップ
- etc...
開発中盤から1台は自動プレイ用に常に稼働していた筐体がありましたが、そちらはほぼほぼ24時間フル稼働させていた結果、マスターアップ時点の累積プレイ時間は2000時間を超えるものとなっていました。(およそ250人日分の働き!!)
まとめ
今回の自動プレイの実装では、専用のデータを殆ど用意せずゲーム本編の調整があっても自動プレイの調整を行うことはあまりしないで済む方法として実装できました。
実装方法としてメリットが多いように思えるかもしれませんが、もちろんデメリットもありました。
- ランダムでアクセスするためすべてのチェックを網羅できているわけではない
- 同様の理由としてランダム操作が多く、複雑な条件のチェックができていない
- キャラクターの移動効率は良くないため1周あたり300時間かかってしまった
これらは実際に運用してみて、今回の問題点・反省点と感じました。
今後の課題として、これらの問題を解消しより効率よく細部までのチェックを行える仕組みを考えていきたいと思っています。
アトラスではこのような取り組みに興味のある方を募集しています。もしご興味を持たれましたら下記サイトにアクセスしてみてください。
©SEGA/©ATLUS