新規ゲームへの対応手順
ゲーム操作用クラスの実装
Item Collector がゲームを起動し、操作可能にするには、最初に以下のクラスを実装する必要があります。
- ゲーム環境を制御するクラス
- ゲームからの受信データを処理・格納するクラス
- プログラム側からゲームを操作するためのパッド入力を定義するクラス
このうち、2, 3 のクラスに関しては Map Scanner で実装したクラスと全く同一のものになります。 詳細はこちらを参照してください。
以下、「1. ゲーム環境を制御するクラス」のみ解説します。
ゲーム環境を制御するクラス
Map Scanner との連携をつかさどるクラスとして core/wrapper.py
の UE4Wrapper
クラスがあります。
個々のゲームに合わせた処理ができるよう、UE4Wrapper
を継承したクラスを用意し、以下の関数を実装してください。
reset()
: リセット処理。ゲームを再度起動し、接続を行うopen()
: ゲームの起動を行うstep()
: パッド入力をして、ゲームからの返答を待つ。(ゲーム側の処理を 1 フレーム進める)step_first()
:step()
の特殊対応版
サンプルゲームでの例
サンプルゲームでは alfort/alfort_wrapper.py
にて UE4Wrapper
を継承した ItemCollectorWrapper
クラスを定義しています。
具体的な実装内容は上記を参照してみてください。
アイテム回収の準備処理の実装
ゲームを操作する処理は基本的に core/thread_main.py
の ComThreadMainMain
クラスに実装されています。
ComThreadMainMain
クラスの実装を確認することでゲームを操作してアイテムを回収する処理を理解することが可能です。
ComThreadMainMain
クラスは以下の流れでアイテム回収を開始します。
- ゲームを起動
menu_debug_setting()
を実行して、タイトル画面からゲームプレイ画面に遷移するgame_debug_setting()
を実行して、スキャン前に必要な設定を行う- アイテム回収を開始する
- 場合により、
switch_debug_move()
を実行して、デバッグ移動モードへの切り替えを行う
各ゲームでアイテムを回収を行うには、事前にゲームごとに以下の処理の実装をしていく必要があります。
- ゲームプレイ画面までの遷移処理
- アイテム回収前の設定処理
- その他の定型処理(Order)
上記それぞれの処理は、Map Scanner で実装したクラスと全く同一のものになります。 (ただし、「アイテム回収前の設定処理」は「スキャン前の設定処理」に相当します)
詳細はこちらを参照してください。
探索データの準備
マップスキャンツールから、探索を行った map_data ファイルを Python/
に配置してください。
graph_data.bin
は Astar 探索用のグラフデータです。
キャラクターの動作制御処理の実装
Item Collector のエージェントは、経路探索で得られたルートに従ってプレイヤーを自動操作します。
キャラクター制御を行うには core/client_agents.py
の BaseAgent
クラスを継承したクラスを用意して、そこでゲームごとに実装する必要があります。
path_move()
: マップデータと Astar を利用して、通常移動モードを使った移動です。collect_item()
: アイテム回収の回収動作です。debug_move_mode()
: デバッグカメラモード(自由移動モード)を使った移動です
探索で得られた経路をプレイヤーが自動で上手く移動できているかを確認してください。 移動に失敗するのであれば、コード内のコメントを参考にしながら、自動操作のルールを適切に変更してください。 新しい動作 (例: 中に入っているアイテムを回収するために木箱を攻撃して破壊する) を追加したいのであれば、ステートマシンの構成も変更する必要があります。
サンプルゲームでの例
サンプルゲームでは alfort/client_alfort_agents.py
にて BaseAgent
を継承した AlfortAgent
クラスを定義しています。
具体的な実装内容はゲームによって違います。
実行結果の可視化の準備
ゲーム内マップ画像の準備
実行結果を可視化するためにツール内で表示するゲーム内マップ画像を用意します。用意できたら Python/pic/
以下に配置してください。
また、画像のファイル名は {マップのコード名}.jpg/png/etc
としてください。
このコード名は Playable! Map Scanner で決定したものと同じものを用いてください。
アイテム情報ファイルの配置
アイテム情報を記録しているファイル XXXX_Treasure.json
を対応する地図ファイルの下( hitbox ファイルと同じ場所)に置いてください。
セーブデータのロードを行うだけで指定したマップへ移動できるように、プレイヤーが各マップに存在する状態のセーブデータを作成してください。
itemcollector.py の修正
itemcollector.py
は実行結果を可視化するための GUI を構築するコードです。
利用にあたり、以下の変数を修正する必要があります。
- class GUI
MAP_NAME_TABLE
: マップのコード名とゲーム内名称を対応させた辞書 (dict) です。テストを行いたいマップの分だけ登録してください。MAP_SAVEDATA_TABLE
:"save_data"
に 事前準備 2 で作成したセーブデータのファイル名 (拡張子なし) を記述してください。 また、"name"
に各マップのゲーム内名称を登録してください。これは上述のMAP_NAME_TABLE
(dict) から取得できます。UE4 であればゲームのセーブデータ用ディレクトリは
WindowsNoEditor/{ゲームのコード名}/Saved/SaveGames/
以下にあると思われます。ITEM_TYPE_TABLE
: 回収したいアイテムの種類を全て登録してください。 形式は"アイテムのコード名": ["アイテムのゲーム内名称", 可視化に用いるプロット点の色]
です。 可視化に用いるプロット点の色は(R, G, B, アルファ値)
の形式で指定する必要があります。class GUI
上部の定数定義部分を参考にしてください。
ツールで自動回収したいアイテムの種類 (itemcollector.py > class GUI > ITEM_TYPE_TABLE
) を変更した場合は、
マニュアル における操作方法の説明や画像もそれに合わせて変更してください。