Map Scanner によるマップスキャン
- 環境の構築
- 作業フォルダの作成
- ツールのコード変更
- ゲームを制御するクラスの作成
- ゲームから受け取るデータのハンドリング
- パッド入力の対応
- タイトル画面からゲームプレイ画面に遷移するための対応
- スキャン前の事前処理
- Order の用意
- スキャン中のキャラクターの動作制御
- スキャン用パラメータの設定
- マップスキャンと経路探索の実行
環境の構築
こちらを参照して、Map Scanner 用の Python 仮想環境を構築してください。
作業フォルダの作成
こちらを参照して、ダウンロードした Map Scanner のソースコードフォルダのコピー、およびフォルダ名とインポート先の変更を行ってください。
なお、{新規ゲーム名}
の部分は template
としてください。
ツールのコード変更
ゲームを制御するクラスの作成
Third Person テンプレートでは、サンプルゲーム用の実装がそのまま使用できます。
ゲームから受け取るデータのハンドリング
Third Person テンプレートでは、サンプルゲーム用の実装がそのまま使用できます。
Third Person テンプレートでは存在しない情報を参照するための関数があることには注意してください。 今回の例では該当する関数が呼ばれることはないため、そのままでも問題ありません。
パッド入力の対応
Third Person テンプレートでは、サンプルゲーム用の実装がそのまま使用できます。
タイトル画面からゲームプレイ画面に遷移するための対応
Python/custom/template/custom_client_thread.py
> CustomComThread
クラス > title_menu_setting()
にタイトル画面で行うべき操作コマンドが定義されています。
ただし、Third Person Template はゲームを起動すると直接ゲーム画面へ遷移するため、コードには実行できない操作コマンドも含まれています。
下記の例に従って一部をコメントアウトしてください。
def title_menu_setting(self):
"""
タイトル画面を突破する
"""
"""
self.order_list.append(custom_order.SelectTitleMenu("ロード"))
self.order_list.append(custom_order.LoadMenu(self.save_data_name))
"""
self.order_list.append(custom_order.WaitLoading())
スキャン前の事前処理
スキャン開始前にプレイヤーの移動モードを「デバッグ移動モード」に変更する必要があります。
Python/custom/template/custom_client_thread.py
> CustomComThread
クラス > set_debug_function()
にこれを行うための操作コマンドが定義されています。
ただし、Third Person Template では該当するゲーム仕様が存在しないため、コードには実行できない操作コマンドも含まれています。
下記の例に従って一部をコメントアウトしてください。
def set_debug_function(self):
"""
デバッグ機能の設定
"""
self.order_list.append(custom_order.WaitSec(1))
"""
self.order_list.append(custom_order.OpenDebugMenu(True))
self.order_list.append(custom_order.SetDebugMenu("Player無敵切り替え"))
self.order_list.append(custom_order.SetDebugMenu("位置情報の表示切り替え"))
self.order_list.append(custom_order.SetDebugMenu("全ての扉を開放する"))
self.order_list.append(custom_order.OpenDebugMenu(False))
self.order_list.append(custom_order.WaitSec(5))
"""
self.order_list.append(custom_order.SetDebugMove())
self.order_list.append(custom_order.SetDebugSpeed(self.scan_speed))
Order の用意
大部分がそのまま利用できますが、デバッグ移動に関する Order は一部変更が必要です。
Python/custom/template/custom_order.py
> class SetDebugSpeed
ゲームへの組み込み で説明した手順に従って実装した場合、デバッグ移動に関するパラメータは DebugCamera
フィールドから参照できるようになっています。関連する部分を以下のように変更してください。
def execute(self, game_dict: dict) -> Tuple[bridge.PseudoPadInput, bool]:
# (略)
else:
self.push_key = True
# speed_now = game_dict["Alfort"]["DebugCamera"]["MoveSpeed"] # この行をコメントアウト
speed_now = game_dict["DebugCamera"]["MoveSpeed"] # この行を追加
# (略)
Python/custom/template/custom_order.py
> class SetDebugMove
先述の class SetDebugSpeed
と同じ要領で以下の変更を行ってください。
def execute(self, game_dict: dict) -> Tuple[bridge.PseudoPadInput, bool]:
# (略)
if self.start_frame is None:
# self.start_debugmove_state = game_dict["Alfort"]["DebugCamera"]["DebugCameraMode"] # この行をコメントアウト
self.start_debugmove_state = game_dict["DebugCamera"]["DebugCameraMode"] # この行を追加
self.start_frame = self.elapsed_frame
# (略)
if self.elapsed_frame - self.start_frame > 80:
pad_input.LeftTriggerThreshold = False
pad_input.RightTriggerThreshold = False
pad_input.LeftThumb = False
# if game_dict["Alfort"]["DebugCamera"]["DebugCameraMode"] != self.start_debugmove_state: # この行をコメントアウト
if game_dict["DebugCamera"]["DebugCameraMode"] != self.start_debugmove_state: # この行を追加
done = True
# (略)
スキャン中のキャラクターの動作制御
Third Person テンプレートでは、サンプルゲーム用の実装がそのまま使用できます。
スキャン用パラメータの設定
以下の手順で _map_list.yaml
の内容を書き換えてください。
なお、Third Person Template のマップ ID を template
と定めます。
サンプルファイルでは PL_
で始まる文字列 (PL_010VIL
、PL_020RIV
など) がマップ ID に相当しますので、この部分を適宜読み替えてください。
_map_list.yaml
の詳細については、こちらを参照してください。
_map_list.yaml
には Collision Checker 用の設定も存在しますが、ここでは Map Scanner に関係する設定のみを変更するようにしています。
Collision Checker 用の設定の変更は Collision Checker の項 で説明します。
セーブデータのファイル名の書き換え
スキャン開始時に読み込むセーブデータのファイル名を書き換えます。Third Person Template にはセーブデータが存在しないため、map_params > template > save_data
に none
と記述します。
save_data に none
と書けばセーブデータのないゲームに対応できるわけではありません。これまでの手順でセーブデータを読み込む処理をコメントアウトしているために、セーブデータのファイル名とは関係のない文字列を入れても問題が起こらないようになっています。
// _map_list.yaml
map_params:
template:
save_data: none
探索開始地点の書き換え
幅優先探索でプレイヤーが到達可能な範囲を列挙する際の探索開始地点を書き換えます。map_params > template > search_start
を以下のように変更してください。
// _map_list.yaml
map_params:
template:
search_start:
x: 900
y: 1110
z: 100
指定している座標は ThirdPersonCharacter
アクタが配置されている座標です。
スキャン範囲の書き換え
マップスキャンを行う範囲を書き換えます。map_params > template > X/Y/Z > End/Start
を以下のように変更してください。
実際にプレイヤーが行動できる範囲よりも少し広めに指定してください。 ここでは x, y 座標については周囲 4 方向を覆う壁より少し外側、z 座標については下限を床より少し下側、上限を十分に大きな適当な値としています。
map_params:
template: // マップ ID
x:
End: 3400 // X範囲終了位置
Start: -400 // X範囲開始位置
y:
End: 3900
Start: -400
z:
End: 1000
Start: 0
Third Person テンプレート用の _map_list.yaml
を参考に掲載しておきます。
engine_type: unreal_engine
env_path: ./WindowsNoEditor/ThirdPersonTemplate.exe
scan_info:
scan_speed: 4000 # スキャン速度 debug移動コードと速度変更コードと対応
grid_cell_size: 40 # スキャングリッドサイズ(生成するボクセルマップのボクセルのサイズ)
scan_window_size:
front_back: 200 # スキャンウィンドウの前後サイズ laycastがカバーする前後の範囲
top_bottom: 1200 # スキャンウィンドウの上下サイズ laycastがカバーする上下の範囲
scan_window_overlap_count: # スキャンの重複回数 laycatの配置方法とスキャン結果に基づいて調整
front_back: 2 # スキャンウィンドウの前後繰り返し回数
top_bottom: 2 # スキャンウィンドウの上下繰り返し回数
scan_window_overlap_offset: # スキャンの重複進行距離 laycatの配置方法とスキャン結果に基づいて調整
front_back: 110 # スキャンウィンドウを前後に繰り返した場合、ステップ距離をどのくらい保つか
top_bottom: 450 # スキャンウィンドウを上下に繰り返した場合、ステップ距離をどのくらい保つか
step_move_limits:
horizontal_move_limit: 480 # ジャンプ時 水平に最大距離
upward_move_limit: 360 # ジャンプ時 上に最大距離
downward_move_limit: 1200 # ジャンプ時 下に最大距離
player_height: 180 # キャラクターの身長
collision_check_params: # コリジョンチェック用パラメータ
reset_limit: 300 # 一回の衝突でこの時間を超えた場合リセット処理を実行する
move: # 通常移動による衝突
normal_overstep: 100 # 壁方向への移動時間(ステップ数: 基本的に1/30秒が1ステップとなります)
random_overstep: 50 # ランダム方向への移動時間
random_move_num: 5 # ランダム方向への移動回数
jump:
max_jump_num: 5 # 際の最大でジャンプする回数
jump_interval: 150 # ジャンプ操作の実行間隔(ステップ数)
map_params:
template:
name: template
drop_threshold: -1000 # このマップにおける落下判定しきい値(コリジョンチェックで使用)
save_data: none
x:
end: 3400
start: -400
y:
end: 3900
start: -400
z:
end: 1000
start: 0
plot:
coef_x: 0.2422092335702037
coef_y: -0.23905962308740128
bias_x: -16.59734015990719
bias_y: 815.5127341753929
search_start:
x: 900
y: 1110
z: 100
マップスキャンと経路探索の実行
ここまでの作業で、Map Scanner が Third Person テンプレート上で使用できるようになりました。実際にマップスキャンと経路探索を行う手順については ツールマニュアル を参照してください。
なお、Third Person テンプレートではレベル上にマップ遷移用のコリジョンが存在しないため、{マップ ID}_hitbox.json
は必要ありません。