情報は力ではない

UE4 とか Blender とか。

命名規則に従ったアセットの自動リネームとアセットバリデーション

この記事は Unrealn Engine 4 (UE4) Advent Calendar 2020 その1 の7日目の記事です。

qiita.com

6日目の記事は はるべえ haru さんの 「【UE4】Toon + PBRを生き残れ」でした。

qiita.com

今回の内容

先日、命名規則に従ったアセットの自動リネームと、アセットバリデーションをやってみました。今回はその実施したことの簡単な紹介記事となります。

アセットの自動リネームは、はのば さんの記事*1、アセットバリデーションは、おかず さんの記事*2を参考にさせていただきました。命名規則については Allar さんのスタイルガイド*3をもとにしています。

今回作成した .uasset は以下に配置していますので、よければダウンロードしてみてください。解凍して Content 直下に配置すれば中身を確認できるかと思います。

https://drive.google.com/file/d/1di_Z5-YbVvCkHdLm8L-BEWQgbDynPwm3/view?usp=sharing

UE4.25 で作成しています。それ以前のバージョンのプロジェクトだと Content に配置してもアセットを見れない可能性があるかと思います。

アセットの自動リネーム

今回は Editor Utility Widget を使用して、コンテンツブラウザーで選択したアセットをリネームするようにしました。以下の動画は動作イメージです。選択したアセットがリネームされているのが確認できるかと思います。
※キャプチャソフトの問題で Rename ボタン押下後のプログレスダイアログが表示されていません。。。

youtu.be

Editor Utility Widget の作成

コンテンツブラウザで Editor Utility Widget を作成します。

f:id:masahiro8080:20201204221031p:plain

UI の作成

作成した Editor Utility Widget を開き、デザイナータブで UI を作成していきます。今回はアセットの種類に応じてプレフィックスを設定し「Rename」ボタンを押下することで選択したアセットがリネームされるようなイメージにしました。

f:id:masahiro8080:20201206101816p:plain
UI 作成

リネーム処理の作成

グラフタブに移り、リネーム処理を記述していきます。アセットのリネームには Rename Asset 関数を使用します。Rename Asset 関数は2つありますが、今回は画像上側の関数を使用しています。

f:id:masahiro8080:20201204215842p:plain
Rename Asset 関数

No Target 説明
1 Editor Utility Library 上側のノード。Asset ピンに接続したアセットを New Name ピンで設定した名前に変更します。
2 Editor Asset Library 下側のノード。Source Asset Path で指定したアセットを Destination Asset Path で指定したパスに変更します。名前の変更も可能ですが、ディレクトリの移動に使用できます。UNIXmv コマンドに近いかと思います。

選択したアセットが命名規則に従っていない場合 Rename Asset 関数で、そのアセットにプレフィックスを付与するような処理を記述しています。

ボタン押下時の処理の概要。選択したアセット群を変数に保存し、それらに対しリネーム処理を実施しています。 https://cdn-ak.f.st-hatena.com/images/fotolife/m/masahiro8080/20201206/20201206095932_original.png

リネーム処理本体。変数に保存したアセットを UI で表示しているクラス毎に抽出し、各アセットが命名規則に従っているか確認後、従っていなければリネーム処理を行っています。 https://cdn-ak.f.st-hatena.com/images/fotolife/m/masahiro8080/20201206/20201206110009_original.png

以上で、リネーム処理の記述が終わりです。

Editor Utility Widget の表示とリネームの実行

作成した Editor Utility Widget をコンテンツブラウザで右クリック。Run Editor Utility Widget を押下すると Editor Utility Widget の画面が表示されます。 あとはコンテンツブラウザでアセットを選択し Rename ボタンを押下することで自動的にリネームすることが出来ます。

f:id:masahiro8080:20201206123654p:plain

アセットバリデーション

次にアセットのバリデーションです。 Editor Utility Blueprint を使用して、アセット保存時にそのアセットが命名規則に従ってなければ、メッセージログで、エラーメッセージを出すようにしていきます。

以下の動画は動作イメージです。選択したアセットを意図的に命名規則と違う名前でリネームすると、保存時に自動的にバリデーションチェックが走り、エラーメッセージが表示されるのが確認できるかと思います。
※キャプチャソフトの問題でアセット名変更後のプログレスダイアログが表示されていません。。。

youtu.be

Editor Utility Blueprint の作成

まず Editor Utility Blueprint を作成します。parent class には EditorValidatorBase を選択します。

f:id:masahiro8080:20201206124729p:plain
f:id:masahiro8080:20201206124839p:plain

バリデーション対象の決定とバリデーション処理

作成した Editor Utility Blueprint を開きます。 バリデーション対象とバリデーションの処理を行うには CanValidateAsset 関数と ValidateLoadedAsset 関数をオーバーライドします。

No 関数名 説明
1 CanValidateAsset In Asset ピンに入ってきたアセットがバリデーション対象かどうかを指定します。バリデーション対象であれば true を返すようにします。
2 ValidateLoadedAsset バリデーションチェック本体。In Asset ピンのアセットを確認して、バリデーションエラーかどうかを判断します。

まず CanValidateAsset 関数をオーバーライドしていきます。In Asset ピンのアセットクラスがバリデーション対象のクラスかどうかを判定しています。

https://cdn-ak.f.st-hatena.com/images/fotolife/m/masahiro8080/20201206/20201206130047_original.png

TypeToConvention 変数は、バリデーション対象のクラスをキーにしたマップです。バリューには命名規則プレフィックスを指定しています。

f:id:masahiro8080:20201206130231p:plain

次に ValidateLoadedAsset 関数をオーバーライドします。この関数では、バリデーションを通過した場合は Asset Passes 関数を呼び、Valid を返し、バリデーションエラーの場合は Asset Fails を呼び、Invalid を返すようにしていきます。

In Asset ピンのアセットクラスに対応したプレフィックスになっているかを確認し、命名規則通りであれば Asset Passes 関数を呼び、Valid を返し、 そうでなければエラーメッセージを構築し、Asset Fails 関数にエラーメッセージ渡し、返り値として Invalid を返すようにしています。

https://cdn-ak.f.st-hatena.com/images/fotolife/m/masahiro8080/20201206/20201206130755_original.png

以上で、バリデーションチェック処理が完了です。

あとは Asset Actions > Validate Assets でのバリデーションや、アセット保存時にこのバリデーションチェックが実行されます。

※作成した Editor Utility Blueprint は Editor の起動時に読み込まれるそうなので、作成後は一度 Editor を再起動する必要があるそうです。

おわりに

初めて Editor Utility Widget や Editor Utility Blueprint を使いましたが、便利です。他にもいろいろ使えそう。 アセットの自動リネームに関しては、選択したディレクトリ以下のアセットにもリネーム処理を行ったり、サフィックスについても付与したりしたいですね。 また、今のバリデーションチェックは十分ではないので、そのあたりも修正していきたいです(例えば AI Controller は AICプレフィックスにしたいのですが、AI Controller も Blueprint のため、現状の処理だとプレフィックスを BP_ にしてくださいというエラーメッセージが出てしまう等)

作成したブループリントの関数のキャプチャには Naotsun の GraphPrinter プラグインを使用しました。選択したノードのキャプチャが取れてこちらも便利です。

github.com