事前準備
概要
事前準備では主に以下の作業を行います。
- コリジョンチェックの実行に必要な前処理とファイルの準備作業
- 各 PC にテスト用ファイル一式を配布し、Python 実行環境を構築
対応手順
1. 仮想環境の構築
コリジョンチェック用の Python 仮想環境を構築します。 手順はこちらを参照してください。
2. マップスキャンデータの準備
これ以降の工程は Map Scanner による地形のスキャンが完了した後でなければ行うことはできません。
Python/
フォルダ内にdata
フォルダ を作成します。Python/data/
フォルダ内にmapdata
フォルダを作成します。マップスキャンで得られたファイル群を
Python/data/mapdata/
以下に配置します。 最終的に以下のようなファイル構成になっていることを確認してください。Python/
…
└ data/
└ mapdata/
└ {マップA}/
└ road_data/
└ wall_data/
└ water_data/
└ _is_close.npy
└ _search_map.npy
└ {マップB}/
└ …
└ _map_list.yaml
3. 座標変換係数の計算
コリジョンチェックの結果は専用のビューワーツール (result_viewer.py
) を使って行います。
この時、ツール上に表示したマップ画像にテスト結果をプロットするために、ゲーム内の座標とプロット先の座標を対応させる必要があります。
この対応に必要なパラメータ(1 次変換係数)をテスト対象となる各マップ毎に計算します。
map_param_calc.py を用いて 1 次変換係数を求めます。使い方はリンク先を参照してください。
Python/data/mapdata/_map_list.yaml
に 1 で得られた係数を書き加えます。 上記リンクにあるように計算結果がコンソール出力されるので、plot_coefficient
とplot_bias
の値を以下の形式に従って追加してください。Map_data:
{マップID_1}:
Name: {マップ名称_1} ← 追加する内容
X:
End: 24000
Start: 1000
Y:
End: 20000
Start: -10000
Z:
End: 6000
Start: -2000
Plot: ← 追加する内容
Coef_X: {plot_coefficient の 1 つ目の値}
Coef_Y: {plot_coefficient の 2 つ目の値}
Bias_X: {plot_bias の 1 つ目の値}
Bias_Y: {plot_bias の 2 つ目の値}
{マップID_2}:
(略)
4. データフォルダの作成
Python/data/
フォルダ内にtestdata
フォルダを作成します。
この後の作業工程にてtestdata
フォルダにコリジョンチェックの実行に必要なファイル一式を入れていきます。Python/data/testdata/
フォルダ内に {マップ名} フォルダを作成します。
この後の作業工程でフォルダ内に以下ファイルを配置していきます。{マップ名}/
└ {マップA}__collision_completed.json - コリジョンファイル
└ {マップA}__XXXX.sav - テスト開始時に読み込むセーブデータ
└ {マップA}__???.??? - 上記セーブデータに付随するファイル (該当するものが存在する場合)
5. セーブデータの作成
コリジョンチェックの実行時やテスト結果の確認時に、選択したマップへ移動するためのセーブデータを作成します。テスト対象としたいマップの数だけ以下の作業を行ってください。
実際にゲームを操作し、テスト対象としたいマップまでプレイヤーを移動させます。この時、デバッグ移動などを使って移動時間を短縮してもよいですが、必ず移動先のプレイヤー座標が実際のゲームプレーで到達可能な座標になるようにしてください。
テスト対象のマップまで移動できたらゲームのセーブ機能を使用してセーブデータを作成します。Unreal Engine のビルド済みゲームを用いた場合、セーブデータは
WindowsNoEditor/(ゲームのプロジェクト名)/Saved/SaveGames/
以下に存在する可能性が高いです。手順 2 で作成されたセーブデータのファイル名を仮に
XXXX.sav
とすると、Python/data/testdata/{マップ名}/
以下にセーブデータをコピーし、{マップ名}__XXXX.sav
にリネームします。注意_ (アンダーバー) は 2 つあることに注意してください。
ゲームによっては
XXXX.sav
に付随して別のファイルが作られる可能性が考えられます。これに該当する場合、そのファイルも手順 3 と同様の手順でコピーとリネームを行ってください。備考例えば、サンプルゲームではセーブデータ本体である
XXXX.sav
と同時にSharedData.sav
というファイルが作成されます。
6. コリジョンファイルの生成
衝突すべき壁がある箇所を抽出し、その箇所をテスト対象として設定する役割を持つコリジョンファイルを生成します。
Python/make_colfile.py
を実行します。オプションについては下記を参照してください。コリジョンファイルの生成が完了するとコンソールにgenerate finished: {ファイル名}
と出力されます。# 指定したマップのみ実行する場合はマップ名を指定
# マップ名: {PL_010VIL, PL_020RIV, PL_030GRP, PL_050GRH}
python make_colfile.py -m {マップ名}
# 全マップ実行する場合
python make_colfile.py -m all生成されるコリジョンファイルは json 形式となっており、以下の構造になっています。
* "Collision": 目標点リスト (dict)
* "{目標点の index}": (dict)
* X: 目標点座標_X (float)
* Y: 目標点座標_Y (float)
* Z: 目標点座標_Z (float)
* Dir: 衝突方向ベクトル (dict)
* X: 衝突ベクトルの X 成分 (float)
* Y: 衝突ベクトルの Y 成分 (float)
* Z: 衝突ベクトルの Z 成分 (float)Python/data/testdata/{マップ名}/
以下にコリジョンファイル{マップ名}__collision_completed_{最短の目標点配置間隔(int)}.json
があることを確認してください。コリジョンファイルのファイル名を
{マップ名}__collision_completed.json
に変更します。備考make_colfile.py
の実行オプションには最短の目標点配置間隔を指定するものがあります。現在のデフォルト値75
は サンプルゲームにおける最適値ですが、新たなゲームでテストを行う際には、地形のスケールの関係から最適値が異なる可能性が考えられます。この際、適切な目標点配置間隔になるように複数回コリジョンファイルの生成を行う必要性があり、ファイルが上書きされないようにファイル名にこの数値を含めています。
7. 目標点の配置結果の確認
coltest_checker.py
を使い、目標点が適切な位置に配置できているかどうかを目視確認します。
Python/coltest_checker.py
を実行します。すると図のような GUI が表示されます。「Select File」ボタンをクリックするとファイル選択ウィンドウが開きます。 「コリジョンファイル」には配置結果を確認したいマップのコリジョンファイル、「ゲームバイナリ」にはゲーム本体 (exe) のパスをそれぞれ指定してください。
コリジョンファイル、ゲームバイナリの両ファイルを指定した後、「ゲームを起動」をクリックするとゲームが起動します。 どちらか一方でも指定されていない場合は起動できません。
ゲームが起動したら、手動で適切な操作を行ってタイトル画面を抜け、ゲーム画面に遷移します。
手順 2 で指定したコリジョンファイルに対応するマップまで移動します。対象マップがプレイヤーの開始地点から遠い場合、デバッグ移動が便利です。
対象マップに到着したらキーボードの「@ (UE4)」もしくは「^ (UE5)」を押します。 すると、ゲーム画面左下にコンソールが表示されるので、「coltest_draw_colpoint」と入力し、「Enter」を押します。
手順 6 の後、コリジョンファイルに記述された目標点がゲームのフィールド内に赤い直方体として描画されます。 フィールド内を歩き回り、通常のプレーでは到達できない箇所に目標点が配置されていないかどうか、逆に配置されるべき箇所なのに配置し損ねていないかどうかを確認してください。
また、目標点の配置結果は GUI 上でも大まかに確認できます。 「▽ 目標点情報」ウィンドウの「表示/非表示」にチェックを入れると、「▽ マップ表示」ウィンドウ内のマップ画像中に目標点が描画されます。赤い丸が目標点、その丸から伸びる黒い線は各目標点に設定された衝突方向 (=衝突すべき壁がある方向) を表しています。この黒い線が壁のある方向に向かって伸びているかどうかも確認してください。
配置結果、及び各目標点に割り振られた衝突方向が適切な場合、この作業は完了となります。
備考通常のプレーでは到達できない箇所に目標点が配置されている場合、原因は以下の 2 パターンが考えられます。
- マップスキャンの不備により、本来は通過不可能な平面 (床、壁、オブジェクトの表面など) となっている部分に穴が空いてしまったため、その内部には入り込むことができるので目標点を配置してもよいとプログラムが判定してしまう
- 目標点配置アルゴリズムが考慮できていない未知のパターンが存在することで、配置結果が適正なものとならない
この場合は、その時々に応じた対応が必要となります。
8. テストデータ一式の配置
対応手順「3.座標変換係数の計算」〜「7.目標点の配置結果の確認」をテストマップの数だけ繰り返します。
最後にゲームビルド時に生成された WindowsNoEditor
フォルダを Python
フォルダ内に移動します。
全てのテストマップの準備作業が完了したら、以下のようなファイル構成になっていることを確認してください。
Python/
└ 既存コード色々
…
└ WindowsNoEditor/
└ data/
└ testdata/
└ {マップA}/
└ road_data/
└ wall_data/
└ water_data/
└ _is_close.npy
└ _search_map.npy
└ {マップA}__collision_completed.json - コリジョンファイル
└ {マップA}__XXXX.sav - テスト開始時に読み込むセーブデータ
└ {マップA}__????.??? - 上記セーブデータに付随するファイル (該当するものが存在する場合)
└ {マップB}/
└ …
9. 他クライアント PC への展開
下記手順により、テストで使用する他の全てのクライアント PC へデータを展開します。
- Python フォルダをまるごと zip/7z などに圧縮します。
- テストで使用する全 PC に圧縮したファイルを転送します。
- テストで使用する全 PC に Python の仮想環境を導入 & 依存パッケージをインストールします。
- 上記で転送したファイルを展開します。
- 手順 1 で示した Python の仮想環境構築作業を行います。