命名規則に従ったアセットの自動リネームとアセットバリデーション
この記事は Unrealn Engine 4 (UE4) Advent Calendar 2020 その1 の7日目の記事です。
6日目の記事は はるべえ haru さんの 「【UE4】Toon + PBRを生き残れ」でした。
今回の内容
先日、命名規則に従ったアセットの自動リネームと、アセットバリデーションをやってみました。今回はその実施したことの簡単な紹介記事となります。
アセットの自動リネームは、はのば さんの記事*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 ボタン押下後のプログレスダイアログが表示されていません。。。
Editor Utility Widget の作成
コンテンツブラウザで Editor Utility Widget を作成します。
UI の作成
作成した Editor Utility Widget を開き、デザイナータブで UI を作成していきます。今回はアセットの種類に応じてプレフィックスを設定し「Rename」ボタンを押下することで選択したアセットがリネームされるようなイメージにしました。
リネーム処理の作成
グラフタブに移り、リネーム処理を記述していきます。アセットのリネームには Rename Asset
関数を使用します。Rename Asset
関数は2つありますが、今回は画像上側の関数を使用しています。
No | Target | 説明 |
---|---|---|
1 | Editor Utility Library | 上側のノード。Asset ピンに接続したアセットを New Name ピンで設定した名前に変更します。 |
2 | Editor Asset Library | 下側のノード。Source Asset Path で指定したアセットを Destination Asset Path で指定したパスに変更します。名前の変更も可能ですが、ディレクトリの移動に使用できます。UNIX の mv コマンドに近いかと思います。 |
選択したアセットが命名規則に従っていない場合 Rename Asset
関数で、そのアセットにプレフィックスを付与するような処理を記述しています。
ボタン押下時の処理の概要。選択したアセット群を変数に保存し、それらに対しリネーム処理を実施しています。
リネーム処理本体。変数に保存したアセットを UI で表示しているクラス毎に抽出し、各アセットが命名規則に従っているか確認後、従っていなければリネーム処理を行っています。
以上で、リネーム処理の記述が終わりです。
Editor Utility Widget の表示とリネームの実行
作成した Editor Utility Widget をコンテンツブラウザで右クリック。Run Editor Utility Widget
を押下すると Editor Utility Widget の画面が表示されます。
あとはコンテンツブラウザでアセットを選択し Rename
ボタンを押下することで自動的にリネームすることが出来ます。
アセットバリデーション
次にアセットのバリデーションです。 Editor Utility Blueprint
を使用して、アセット保存時にそのアセットが命名規則に従ってなければ、メッセージログで、エラーメッセージを出すようにしていきます。
以下の動画は動作イメージです。選択したアセットを意図的に命名規則と違う名前でリネームすると、保存時に自動的にバリデーションチェックが走り、エラーメッセージが表示されるのが確認できるかと思います。
※キャプチャソフトの問題でアセット名変更後のプログレスダイアログが表示されていません。。。
Editor Utility Blueprint の作成
まず Editor Utility Blueprint を作成します。parent class には EditorValidatorBase
を選択します。
バリデーション対象の決定とバリデーション処理
作成した Editor Utility Blueprint を開きます。
バリデーション対象とバリデーションの処理を行うには CanValidateAsset
関数と ValidateLoadedAsset
関数をオーバーライドします。
No | 関数名 | 説明 |
---|---|---|
1 | CanValidateAsset | In Asset ピンに入ってきたアセットがバリデーション対象かどうかを指定します。バリデーション対象であれば true を返すようにします。 |
2 | ValidateLoadedAsset | バリデーションチェック本体。In Asset ピンのアセットを確認して、バリデーションエラーかどうかを判断します。 |
まず CanValidateAsset
関数をオーバーライドしていきます。In Asset
ピンのアセットクラスがバリデーション対象のクラスかどうかを判定しています。
TypeToConvention
変数は、バリデーション対象のクラスをキーにしたマップです。バリューには命名規則のプレフィックスを指定しています。
次に ValidateLoadedAsset
関数をオーバーライドします。この関数では、バリデーションを通過した場合は Asset Passes
関数を呼び、Valid
を返し、バリデーションエラーの場合は Asset Fails
を呼び、Invalid
を返すようにしていきます。
In Asset
ピンのアセットクラスに対応したプレフィックスになっているかを確認し、命名規則通りであれば Asset Passes
関数を呼び、Valid
を返し、
そうでなければエラーメッセージを構築し、Asset Fails
関数にエラーメッセージ渡し、返り値として Invalid
を返すようにしています。
以上で、バリデーションチェック処理が完了です。
あとは Asset Actions > Validate Assets でのバリデーションや、アセット保存時にこのバリデーションチェックが実行されます。
※作成した Editor Utility Blueprint は Editor の起動時に読み込まれるそうなので、作成後は一度 Editor を再起動する必要があるそうです。
おわりに
初めて Editor Utility Widget や Editor Utility Blueprint を使いましたが、便利です。他にもいろいろ使えそう。 アセットの自動リネームに関しては、選択したディレクトリ以下のアセットにもリネーム処理を行ったり、サフィックスについても付与したりしたいですね。 また、今のバリデーションチェックは十分ではないので、そのあたりも修正していきたいです(例えば AI Controller は AIC をプレフィックスにしたいのですが、AI Controller も Blueprint のため、現状の処理だとプレフィックスを BP_ にしてくださいというエラーメッセージが出てしまう等)
作成したブループリントの関数のキャプチャには Naotsun の GraphPrinter プラグインを使用しました。選択したノードのキャプチャが取れてこちらも便利です。