Skip to main content
UE4何でも勉強会 in 東京
自動テストでもっと楽したい!
Slideshare用壁紙
Slideshare用壁紙
自己紹介
● Twitter: @com04
● ゲームプログラマー
● UE4: UE4.4~
● 作ったものとかは大体twitterモーメントに
○ https://twitter.com/i/moments/847072031048814594
○ https://twitter.com/i/moments/986364547098275840
● マーケットプレイスに出品しました
○ ComMaterialTools - マテリアル検索の便利ツール
■ https://www.unrealengine.com/marketplace/commaterialtools
自己紹介
● 書いたスライド
− https://www.slideshare.net/com044/presentations
● マテリアルの注意すべきこと!~テクスチャロードとSwitch~
● UE4でAIとビヘイビアツリーと-基礎-
● AI基礎
● UE4でTranslucencyやUnlitに影を落としたい!
● UE4 Volumetric Fogで 空間を演出する!
● UE4 LODs for Optimization -Beginner-
● もっとアニメーションBP
● アニメーション基礎
● エンジンの内部挙動について
● UE4でのチーム製作
5
はじめに
今日話さない事
● ユニットテスト
● C++を使ったUE4の自動テスト機能
はじめに
今日話す事
● UE4の自動テスト機能(BPのみ)
● アセット/レベルチェックの自動化
はじめに
※注意して検証を行いましたが、環境によっての違いや、
間違い等ありましたらごめんなさい
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料 version: UE4.22.2
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
自動テストとは
人の手でチェックする手間を減らして、
自動でチェックしよう!
自動テストとは
10ステージ分チェックしたい!
→ 1ステージ開くのに5分かかる
→ チェックに最低50分以上かかる
チェックするのは週1?月1?
このコストを支払う……?
自動テストとは
他にもプレイヤー、敵、イベント、ロジックのBP……
チェックするのは多岐に……
日々変更するものも多いので、定期的にもチェックしたい
……
自動テストとは
機械的にチェック出来る範囲のチェック・情報収集は、自動
でやってもらおう!
夜間等の業務時間外のPCに頑張ってもらう!
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
出来る事/出来そうな事
なにしてもらう?
出来る事/出来そうな事
● データに問題が無いか自動でチェックする
○ コミット抜け
○ Developersフォルダの直参照
○ クラッシュするBP
○ 設定されるべきフラグが設定されてない
■ 手で起動して、あれ上手く動かない……というのを繰り返す手間を無くす
● もしクラッシュしたら長いレベル開き待ち時間……
出来る事/出来そうな事
● データに問題が無いか自動でチェックする
○ 昔に作ったデータで長いこと動作確認してなかった
■ イベントシーン組もうと思ったら、このレベル開かない、BP動かない
……
■ 待ちが発生する後工程
出来る事/出来そうな事
● プロファイルの自動収集
○ ステージ毎、キャラクター毎の使用メモリ
○ 処理負荷チェック
■ 何十ステージ/何百のイベントを手動チェックしてると、開くだけで数日
が終わってしまう……
出来る事/出来そうな事
● クリティカルな不具合の早期チェック
○ ゲームをずっと自動プレイで流す
■ エンディングまでの通しプレイ
■ クラッシュ
■ メモリリーク
■ 背景のヒット抜けチェック
■ ボタン押すタイミングチェック
● QA始まってから見つかるとつらい……
出来る事/出来そうな事
● イベントやカットシーン
○ イベントフラグの設定間違いが無いか
○ 通常再生とシーンスキップした時のフラグやプレイヤー位置に
差が無いか
○ 途中で停止/クラッシュしないか
○ 負荷チェック
○ 合わせて画面を録画しておくなど
出来る事/出来そうな事
● 設定の挙動
○ セーブ / ロード
○ グラフィックスオプションを変更した時の見た目確認
■ 特にWindows環境
■ 全部の組み合わせとなると膨大……
出来る事/出来そうな事
一部を作ってみました
出来る事/出来そうな事 - 一部を作ってみました
テクスチャのグループ設定が正しく設定されているか
●
出来る事/出来そうな事 - 一部を作ってみました
テクスチャのグループ設定が正しく設定されているか
● テクスチャグループの参考
○ テクスチャグループはグループ別にLODのサイズ制限、Biasやフィル
ターを調整できます
■ テクスチャのサポートと設定 - 公式ドキュメント
● http://api.unrealengine.com/JPN/Engine/Content/Types/Textures/Support
AndSettings
○ [UE4] Texture GroupがTexture Streamingに与える影響 -
EGJ-Nori_Shinoyama
■ https://qiita.com/EGJ-Nori_Shinoyama/items/8b3c2e4e372f05e33476
出来る事/出来そうな事 - 一部を作ってみました
テクスチャのグループ設定が正しく設定されているか
● →サンプル: 01_TextureGroup
○ フォルダとグループを紐づけてチェック。違えば警告出す
■ Characterフォルダ → Characterグループ
■ Environmentフォルダ → Worldグループ
■ Effectフォルダ → Effectグループ
出来る事/出来そうな事 - 一部を作ってみました
テクスチャのサイズが大きすぎないか
● プロジェクトのレギュレーションをチェックする
○ (例)
■ キャラクターのアルベドは4096でも良い
■ 法線マップ、Roughness/Metallic/AOマップは2048まで
■ エフェクトは2048まで
出来る事/出来そうな事 - 一部を作ってみました
テクスチャのサイズが大きすぎないか
● →サンプル: 02_TextureSize
○ 一括で2048を超えていないかチェックする(4096アウト)
出来る事/出来そうな事 - 一部を作ってみました
マテリアルのレギュレーションチェック
● プロジェクトで決められた設定をチェックする
● (例)
○ Automatically Set Usage in Editorは使っては駄目
■ メモリ増大要因(フラグが一杯付いていないか)
○ TranslucencyのSurface Forward Shading使ってないか
■ GPU負荷高い
○ 要C++コードで……
■ インストラクション数のチェック
■ マテリアルインスタンスでStaticSwitch/プロパティを操作していないか
出来る事/出来そうな事 - 一部を作ってみました
マテリアルのレギュレーションチェック
● Automatically Set Usage in Editor の参考
○ マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic
Games Japan: 篠山範明)
■ https://www.slideshare.net/EpicGamesJapan/epic-games-japan-ue4dd/76
出来る事/出来そうな事 - 一部を作ってみました
マテリアルのレギュレーションチェック
● →サンプル: 03_MaterialReguration
○ Automatically Set Usage in Editorのみチェックしています
出来る事/出来そうな事 - 一部を作ってみました
レベルのチェック
● 不必要にTickがONになっているActorが無いか
● 動かないオブジェクトがムーバブルになっていないか
● (例)
○ Planar Reflection使ってないか
○ ステイショナリー、もしくはムーバブルなディレクショナルライトが2
灯以上ないか
出来る事/出来そうな事 - 一部を作ってみました
レベルのチェック
● →サンプル: 04_LevelCheck
○ Tickのチェック
○ PlanarReflectionチェック
○ 可動性ムーバブルチェック
○ ディレクショナルライトが
非スタティックで複数
出来る事/出来そうな事 - 一部を作ってみました
レベルのスクリーンショット撮影
● 各エリアの撮影
● 合わせて各種負荷を見るための情報も撮影
○ stat でメモリ量やDrawCallの数など
○ Shader Complexy(Editorのみ)
○ Quad Overdraw(Editorのみ)
○ Profile
出来る事/出来そうな事 - 一部を作ってみました
レベルのスクリーンショット撮影
● →サンプル: 05_ScreenShot
○ 各種スクリーンショット
○ CsvProfile
出来る事/出来そうな事 - 一部を作ってみました
などなど……
出来る事/出来そうな事 - 一部を作ってみました
これらは新規実装時だけではなく、修正・調整した際に
チェックに引っかかる可能性があります。
可能な限り常時回しましょう。
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
出来る事/出来そうな事 - 自動テスト系の実例参考資料
UE4における大規模背景制作事例(データメンテナンス・大
技設定編 ) - 株式会社スクウェア・エニックス
● https://www.slideshare.net/EpicGamesJapan/ue4-137253045
○ データのメンテナンスについて
○ 安定化の為に、どういうものを、どうチェックしていたか
出来る事/出来そうな事 - 自動テスト系の実例参考資料
● COOK後データ容量
● UE4マップチェックエラー
● ファイル命名エラー
● UE4-ソースデータ照合
● ソースパスエラー
● テクスチャグループ設定
● デベロッパフォルダ参照
● Swarm接続
出来る事/出来そうな事 - 自動テスト系の実例参考資料
UE4における自動プレイのポストモーテム - 株式会社スク
ウェア・エニックス
● https://www.slideshare.net/EpicGamesJapan/ue4-137253042
○ 自動化について書かれています
○ UE4の自動テストだけでなく、自作されていた模様
出来る事/出来そうな事 - 自動テスト系の実例参考資料
● データ更新の自動化 ←今回の自動テストと同じ?
○ HLOD、常駐関連、テクスチャロード関連
● 品質チェックの自動化
○ 負荷、メモリ、カットシーン再生
● 自動プレイ系はほぼ自前でスクリプトを組んでいた模様
出来る事/出来そうな事 - 自動テスト系の実例参考資料
Automated Testing of Gameplay Features in 'Sea of
Thieves' - Rare
● https://www.gdcvault.com/play/1026366/Automated-Testing-of-Gameplay-Features
○ GDC 2019で講演されたUE4の自動テストを用いた例
出来る事/出来そうな事 - 自動テスト系の実例参考資料
● こちらはUnit Test, Integration Test, Actor Test
○ 入力を発生させる→船の舵を回す→メッシュが動く
■ とかのフローが正常に動作するか、をテスト
● 最終的なテストは 23,212 Tests
○ アセットチェックのテストも含めると 104,912 Tests
出来る事/出来そうな事 - 自動テスト系の実例参考資料
Automated Testing at Scale in Sea of Thieves - Rare
● https://www.unrealengine.com/ja/events/unreal-fest-europe-2019/automated-testing-
at-scale-in-sea-of-thieves
○ 先程のスライドと似ていますが、こちらはUnreal Fest Europe
2019版
○ 若干中身違う模様
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
自動テストの実行方法 - エディターから実行
セッションフロントエンドを起動します。
● 「ウィンドウ」 →
「デベロッパーツール」 →
「セッションフロントエンド」
自動テストの実行方法 - エディターから実行
「オートメーション」タブで開きます
自動テストの実行方法 - エディターから実行
行いたいテストにチェックを入れて、
「テストを開始する」を押して実行します
自動テストの実行方法 - エディターから実行
※テストを新規追加した場合は「テストを更新」ボタンでリスト
を更新します。
更新ボタンを押す前に、レベルを保存してください。
自動テストの実行方法 - エディターから実行
終了すると結果が表示されます。
結果が表示されます。
・成功すると緑
・警告が出てると黄色
・エラーだと赤
実行した際のログが表
示されます。
自動テストの実行方法 - エディターから実行
「エラー」ボタン、「警告」ボタンでその結果だけを表示する
事が出来ます
自動テストの実行方法 - エディターから実行
右下の「エクスポート」ボタンから結果をUE4外に出力でき
ます
自動テストの実行方法 - エディターから実行
“Saved/Automation/”の下にcsvファイルで実行ログが出
力されます
自動テストの実行方法 - エディターから実行
毎回チェックボックスを選択しなくて済むように、
プリセットを保存できます。
● 右端の「プリセット」の「+」ボタンで新規追加
● プリセットの保存先は “ConfigAutomationPresets”
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
自動テストの実行方法 - パッケージ版で実行
パッケージ版で確認
自動テストの実行方法 - パッケージ版で実行
パッケージングした後の.exeファイルからでもテストを行え
ます
● Jenkins等でDailyビルドしたパッケージからテストを実
行できます
自動テストの実行方法 - パッケージ版で実行
起動引数で実行できます
● -ExecCmds="Automation RunTests <グループ名>;Quit"
○ BPの場合は、配置したレベルがグループ名になります。
■ (例)
● Project.FunctionalTests./Game/Test/01_TextureGroup/LV_TestTextu
reGroup.BP_TestTextureGroup
グループ名はセッション
フロントエンドで
確認できます
自動テストの実行方法 - パッケージ版で実行
起動引数で実行できます
● グループ名は省略出来ます。
○ 区切りを途中までにすると、それ以下全部を実行します
■ Project.FunctionalTests
● と指定するとプロジェクトにある全部のBPテストを実行します
■ Project.FunctionalTests./Game/Test/01_TextureGroup/LV_TestText
ureGroup
● と指定すると、このレベルに入っているテストBP全部を実行します
自動テストの実行方法 - パッケージ版で実行
起動引数で実行できます
● 調べてみると、どうやら部分一致で実行しているようです
■ ThirdPersonExampleMap
● レベル名だけの指定で、このレベルの中の全てのテストを実行できます
○ (同名のレベルが有るとそっちも実行されると思います)
■ BP_TestScreenShot
● BP名(レベルに配置したActor名)で指定すると、全レベルに配置したこの名前
のテストを実行します
自動テストの実行方法 - パッケージ版で実行
起動引数で実行できます
● こんな感じに
○ -ExecCmds="Automation RunTests <レベル名>;Quit"
■ (例)
● -ExecCmds="Automation RunTests ThirdPersonExampleMap;Quit"
■ 指定したレベルの中を全部チェックしたい時
○ -ExecCmds="Automation RunTests <テストBP名>;Quit"
■ (例)
● -ExecCmds="Automation RunTests BP_TestScreenShot;Quit"
■ 全レベルの指定したテストを行いたい場合
自動テストの実行方法 - パッケージ版で実行
コマンドが長くなるので、batファイルとかに纏めておくと便
利です。
自動テストの実行方法 - パッケージ版で実行
こんな感じで組んで見ました(サンプルに入ってます)
AutomationRakushitai.exe -windowed -LogCmds="global off,LogFunctionalTest log" -ExecCmds="Automation
RunTests LV_LevelCheck;Quit" -log=04_LevelCheck.txt
● -windowed
○ ウィンドウモード起動
● -LogCmds="global off,LogFunctionalTest log"
○ global off: 全部のログを無しに。 LogFunctionalTest log: 今回の自動テストのログのみ出す
● -ExecCmds="Automation RunTests LV_LevelCheck;Quit"
○ 指定のテスト実行して終了する
● -log=04_LevelCheck.txt
○ ログの出力ファイル名を指定。 ”Save/Logs/” の中に出来る
自動テストの実行方法 - パッケージ版で実行
他の起動引数
● -NullRHI
○ 画面無しで起動します
■ Jenkis等でGUI無しで実行したい場合
■ ただし、スクリーンショット等は撮れないので注意
自動テストの実行方法 - パッケージ版で実行
テスト結果のログは”<Project名>/Saved/Logs/”のいつもの
ログに
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
自動テストの作成方法
BPでテストを作成します
自動テストの作成方法
通常のBPの作成し、「Functional Test」を親として作成しま
す
自動テストの作成方法
開くとテストの答案的な絵
自動テストの作成方法
テストの実装はイベントグラフに書いていきます
自動テストの作成方法
Prepare Test
● テストの開始処理。
通常BPのBeginPlayのような感じで初期化に使います。
自動テストの作成方法
Start Test
● テストが開始したら呼び出されます。
実際のテストコードを書きます
自動テストの作成方法
Start Test
● 「Finish Test」ノードでテストを終了します
○ Test Result: 結果を返します
■ Invalid, Error, Failed : 失敗扱い
■ Running : 警告扱い?
■ Default, Successded : 成功扱い
自動テストの作成方法
Tickも回ります
自動テストの作成方法
他、FunctionalTest用のノード
自動テストの作成方法
Log Message
● テストログにメッセージを流します
○ けど、セッションフロントエンド起動の場合、オートメーションの
ログには出てこない……
○ →コンソールアウトプットには出てきます
自動テストの作成方法
Add Warning / Add Error
● ログに警告 / エラーのログを出します
○ このノードを使うと、「Finish Test」でSuccessを返しても警告 /
失敗扱いになります
自動テストの作成方法
Assert系
● 条件が違う時にエラーとして処理します
○ この時はFloat値が1.0じゃないとエラー、とかBoolがTrueじゃ
ないとエラー。という時に
自動テストの作成方法
Take Automation Screenshot
● スクリーンショットを撮ります
○ けどセッションフロントエンドから実行すると失敗する……
■ パッケージからの実行なら問題ないです
○ 出力先は”Saved/Automation/”以下
自動テストの作成方法
Stat系ノード
● Stat系の数値を取得できます
○ 処理回数や、処理時間の計測した数値を拾えます
■ Stat Commands - 公式ドキュメント
● https://docs.unrealengine.com/en-US/Engine/Performance/StatCommands/index.
html
自動テストの作成方法
Stat系ノード
● [Enable / Disable] Stat Group
○ 計測を有効/無効にするグループを指定します
○ 指定する名前はコンソールコマンドで操作するのと同じ名称で
す
■ 「Game」「Engine」「Particles」など。↓の表示出すコマンド。
自動テストの作成方法
Stat系ノード
● Get Stat [Call Count / [Inc/Exc] Average, Max]
○ 呼ばれた回数、平均値、最大値を取ります
○ 「Enable Stat Group」で有効にしていないと取れません
自動テストの作成方法
Stat系ノード
● Get Stat [Call Count / [Inc/Exc] Average, Max]
○ 指定する名前はソースコードで指定されている名称です
■ エンジンのソースコード読めないと使えない……
● ので一覧化してcsvに纏めました
● http://com04.sakura.ne.jp/unreal/wiki/index.php?Automation%20Test
自動テストの作成方法
Stat系ノード
● 使用方法は下記のような形です
○ 先に[Enable Stat Group]で有効にした後、数値を取ります
自動テストの作成方法
Stat系ノード
● ほか
○ 一度その処理を通らないと、警告が返ってくるようです
■ パーティクルが一個も無い状態で、Particles系のパラメーターを取ろうと
すると警告が出る模様…
○ [Enable Stat Group]に使用できるのは、ソースコード側で
「DECLARE_CYCLE_STAT_EXTERN」系のStatのみのよう
です。
■ →「DECLARE_MEMORY_STAT_EXTERN」とかは駄目っぽい…
自動テストの作成方法
タイムアウト設定
自動テストの作成方法
BPには処理のタイムアウト時間が設定できます。
● テスト中に進行不能になった場合、タイムアウトして失
敗した判定に
○ 例えば、自動プレイ中にコリジョンに埋まって身動きが取れな
くなった時とか
自動テストの作成方法
もし行うテストに時間がかかるなら、大きめの値を入れてお
きます。
自動テストの作成方法
● Preparation Time
○ イベント「Prepare Test」のタイムアウト時間
● Time Limit
○ テストのタイムアウト時間
自動テストの作成方法
● Times Up Result
○ タイムアウトした時の成否を選択します
■ ここをSuccessにすると、逆にこの時間動き続けたのでOK。
的な処理もできます
自動テストの作成方法
後はそのBPをレベルに配置すると、配置されたレベルでテ
ストが行えます
自動テストの作成方法
レベル毎にチェックしたい場合は、それぞれのレベルにBP
を入れ込んでいきます
もくじ
● 自動テストとは
● 出来る事/出来そうな事
○ 自動テスト系の実例参考資料
● 自動テストの実行方法
○ エディターから実行
○ パッケージ版で実行
● 自動テストの作成方法
● その他
● 作ってみたサンプルについて
● 参考資料
その他
レベル遷移は出来ません
● テストBPからOpenLevelで遷移
● レベル中からOpenLevelで遷移
○ レベル遷移した時点でテストが終了します
その他
レベル遷移は出来ません
● プロジェクト構成によっては自動プレイは組めないです
……
その他
配置するのはパーシススタントレベルが良さそうです
パーシスタント側には
出たり出なかったり……
サブレベルに配置したテストは
サブレベルで出てくる
その他
GameModeはレベルに設定しているものがそのまま使用さ
れます
● 逆にGameModeをテスト用に上書きする良い方法が見つ
からず……
その他
Test, Shippingパッケージでは動作しません
● CPU負荷をキッチリ取りたい場合は厳しい……