操作マニュアル
ツールの構成
このツールには 3 つの基本ファイルが含まれています。
配布しているツールにはサンプルゲームに対応したスクリプトが含まれています。 これを参考に、自動テストを行いたいゲームプロジェクトに対応するスクリプトを作成してください。
map_scanner_server
サーバープログラムです。 設定したマップ情報からスキャンタスク (指定した広大なマップを細分化した、狭い領域のスキャン) を作成してクライアントに割り当て、 クライアントがスキャンした結果を収集、整理して立体地形データを構築します。
map_scanner_client
クライアントプログラムです。 サーバーから与えられたスキャンタスクを実行し、その結果をサーバーに送信します。
map_scanner_searcher
マップ経路探索の事前計算ツールです。 スキャンによって得られた立体地形データを用いて経路探索の事前計算を行い、 Collision Checker や Item Collector などに必要なデータファイルを生成します。
操作手順
ツールの起動
以下の手順をマップスキャンに使用する PC ごとに行ってください。
- 環境設定 を行っていない場合は済ませてください。
- Anaconda Prompt を起動後、以下のコマンドを実行して Map Scanner 用の仮想環境に切り替えてください。
conda activate mapscanner # 仮想環境の切り替え
cd {playable-map-scanner のディレクトリ}/Python # ディレクトリの移動 - サーバーとして使用する PC では
python map_scanner_server.py
を、 クライアントとして使用する PC ではpython map_scanner_client.py
実行してください。 サーバープログラムとクライアントプログラムを同一の PC で実行することも可能です。 - ツールの起動には少々時間がかかりますので、しばらくお待ちください。
ツール起動後の流れ
ツールが起動すると以下のウィンドウが表示されます。
サーバープログラム
クライアントプログラム
サーバーとクライアントの接続
- 複数のコンピュータを用いてスキャンを実行する場合、map_scanner_server と map_scanner_client の IP アドレスを
map_scanner_server を実行しているコンピュータの IP アドレスに設定し、ポート番号を統一してください。
- 同一のコンピュータで map_scanner_server と map_scanner_client を動かす場合にはデフォルトの設定をそのまま使用してください。
- map_scanner_server 側でスキャンしたいマップを選択し、[サーバーを起動する] をクリックしてください。
- 操作後、以下のような画面が表示されます。
- map_scanner_client 側で [ゲームファイルを選択] をクリックしてゲームファイルを指定してください。
- [サーバー接続] ボタンをクリックし、サーバーに接続してください。
- 成功した場合は以下のような画面が表示されます。
- クライアントがサーバーに接続すると、サーバー側では以下のように接続したクライアントの情報が表示されます。
- 成功した場合は以下のような画面が表示されます。
スキャンの実行
map_scanner_client 側で同時実行するゲームの数を指定します。
実行するゲームの数は [スレッドを増やす] ボタンをクリックするごとに増やすことができ、
ゲームが起動すると自動的にサーバーからタスクを受け取り、スキャンを実行していきます。
ウインドウモードはゲーム側設定ファイル WindowsNoEditor\[ProjectName]\Saved\Config\WindowsNoEditor\GameUserSettings.ini
で変更可能です。
FullscreenMode=1
にするとフルスクリーンにて起動します。FullscreenMode=2
にするとウインドウモードで起動します。
スキャン処理の並列数
map_scanner_client は一度に複数のゲームを起動してスキャンタスクの並列処理を行っていきます。
同時実行するゲームの数は以下を参考に最適な値を指定してください。
- 並列数が多いほどスキャンは短時間で完了しますが、より多くのマシンパワーを必要とします。
- CPU がボトルネックになると思いますので、まずは CPU コア数の半分程度からお試しください。
- ゲームを起動した状態でリソースマネージャーを⽴ち上げ、CPU 負荷率を監視しながら並列数を適切に調整してください。
スキャンの中断と再開
- map_scanner_server 側の [セーブデータ] ボタンをクリックすると、スキャン途中の結果を保存することができます。
- セーブを行うと、
{ツールのルートディレクトリ}/map_data
以下に_map_list.yaml
と対応するマップのスキャンデータを保存します。 - この時、完了済みのスキャンタスクもリストにして保存します。
- セーブを行うと、
- map_scanner_server 側の [ロードデータ] ボタンをクリックすると、保存済みのスキャンデータを読み込み、現在のスキャンデータをロードしたデータに置き換えます。
- この操作の後にスキャンを開始することで、これまでの進捗を引き継いでスキャンを行うことができます。
ツールの終了
map_scanner_server 側の「残タスク」が 0 になり、すべてのスレッドでスキャン中のタスクが None
になればスキャンは完了です。
スキャンが完了したら [セーブデータ] ボタンをクリックして結果を保存し、サーバー側、クライアント側ともにツールをウィンドウの「×」ボタンから閉じてください。
スキャン結果は {ツールのルートディレクトリ}/map_data
以下に保存されます。
スキャン結果を用いた探索の事前計算
最後に、スキャンによって得られた立体地形データを使って経路探索の事前計算を行います。
- スキャンしたマップにレベル遷移用のヒットボックスが存在する場合、
各ヒットボックスの
Location
、Rotation
、BoxExtent
を記述したファイルを用意 (後述)- 例:
PL_010VIL_hitbox.json
を/map_data/PL_010VIL/
以下に配置
- 例:
- map_scanner_searcher を起動
- マップを選択して [search map] ボタンをクリック
- 「スキャンデータを探索中…」のダイアログが消えれば探索完了
探索が完了すると、対応するマップフォルダ以下に次の探索データが保存されます。
- _is_close.npy
- _search_map.npy
- graph_data.bin
サンプルゲームでは、Unreal Engine 上で専用のエディターユーティリティウィジェットを作成することで、レベル遷移用のヒットボックス情報をファイル出力しています。こちらを参照してゲームに合ったものを用意してください。
Scan Result Viewer での結果確認
スキャンで得られた地形、および経路探索の事前計算結果がどのようになっているかは、Scan Result Viewer を使用して確認できます。使い方はこちらを参照してください。
確認の結果、以下に該当する現象が見つかった場合は、適切な結果が得られるまでスキャンパラメータの調整と再スキャンを行う必要があります。
- プレイヤーが到達できる領域全体をスキャンできていない
スキャン範囲を十分に拡大して再度スキャンしてください。 - 本来地形が繋がっているはずの場所に地割れ状の穴がある
スキャン時の移動速度が速すぎてスキャン漏れしているか、何らかの原因でスキャンデータが欠落しています。 スキャン速度を遅くするか、同じ領域を繰り返しスキャンする回数を増やしてください。 設定方法はこちらを参照してください。 - 本来行けないはずの地中などが赤い領域 (スタート地点から到達可能な領域) で示されている
スキャンで得られた地形のどこかに穴が空いており、探索時はその穴を通れば到達可能だと判定された可能性が高いです。対処方法は上の項目と同じで、スキャン速度を遅くするか、同じ領域を繰り返しスキャンする回数を増やしてください。なお、ゲーム実装の不具合で元の地形そのものに穴が空いている場合は、その限りではありません。