TextureのTextureGroupが指定したものではない状態で保存した場合にUEditorValidatorBaseを使用してAssertを出す処理を実装しています。
確かにTextureのウインドウにある保存ボタンで保存を行ったときはAssertを出すことができるのですが、
例えば、Textureのウインドウで保存せず、エディタ自体を閉じようとしたときに出る未保存のファイルを保存するか聞いてくるダイアログで保存した場合assertで止めることができずに間違ったTextureGroupで保存されそのままエディタが閉じてしまうような抜け道?があるのですが、こういうのを防ぐ方法はありますでしょうか。
<br/>
<br/>
エディタ終了時のファイル保存時にValidatorによるチェックは実行されているかログなどで確認はされていますか?
チェック自体が走っていないのであればValidatorの登録の問題が考えられますが、チェックは動作しておりユーザーコードでエラーが検出されたのに関わらずコード中のassertが動作しないような挙動になっているという状態もありうるかもしれません。問題の切り分けのために動作を一度ご確認ください。
例えば以下の様なブループリントValidatorを作成してテクスチャのグループを編集してエディタ終了にファイルを保存するとダイアログが表示されるのでエディタ終了時のチェック自体が動作しないということは無いのではないかと推察しています。
[Image Removed]可能であればValidatorを検証用の再現プロジェクトにマイグレートしてご共有いただけますと具体的な動作を検証することができます。ご検討ください。
`EDataValidationResult USampleTextureEditorValidatorSubsystem::ValidateLoadedAsset_Implementation(const FAssetData& InAssetData, UObject* InAsset, FDataValidationContext& Context)
{
FText DialogText = FText::FromString(TEXT(“TestTestTest”));
FMessageDialog::Open(EAppMsgType::Ok, DialogText);
if (UTexture* Texture = Cast(InAsset))
{
FString AssetPath = InAssetData.GetSoftObjectPath().ToString();
for (FSampleTextureEditorValidatorTextureType temp : PathCorrespondingTextureGroup)
{
if (AssetPath.Contains(temp.AssetPath))
{
if (Texture->LODGroup != temp.TextureGroup)
{
FText ErrorMessage = FText::Format(
NSLOCTEXT(“TextureValidator”, “WrongTextureGroup”,
“The correct TextureGroup is {0}.”),
FText::FromString(UEnum::GetValueAsString(temp.TextureGroup))
);
AssetFails(Texture, ErrorMessage);
return EDataValidationResult::Invalid;
}
else
{
AssetPasses(Texture);
return EDataValidationResult::Valid;
}
}
}
}
return EDataValidationResult::NotValidated;
}`今までダイアログではなくMessageLogを出していたため確認できるまえにエディターが閉じていたようでした。
ダイアログを出力するようにしたらValidatorLoadAssetが通っているのを確認できました。
エディタを閉じる命令を出してしまった後でValidatorLoadAssetで検知したAssetのTextureGroupが指定したものと違った場合、エディタを閉じるのをキャンセルして再編集を促すようにすることは可能なのでしょうか?
検証処理のメインはUEditorValidatorSubsystem::ValidateAllSavedPackagesとなりますが、終了処理の中で呼び出されるUEditorValidatorSubsystem::ValidateSavedPackageでSetTimerForNextTickを用いて次フレームに処理が先延ばしされます。
そのためその検証処理が行われるタイミングではFMainFrameHandlerのShutDownEditorが処理された後になっており、終了処理の差し戻しを行うのは難しそうです。
そのためこの辺りの動作を変更するにはエンジンに手を入れる必要があります。
変更の一案としてはCanCloseEditor関数内でFEditorFileUtils::SaveDirtyPackagesがダーティパッケージがある状態を返した場合にはエディタを直接落とせなくするなどが影響範囲を狭くできるのではないかと思います。