本記事は
Unreal Engine (UE) - Qiita Advent Calendar 2024 - Qiita シリーズ4の 1日目の記事です。
定期的に遭遇するエラーの対処方法を毎回忘れるので、備忘録的な小ネタ記事です。
( 1日目の記事なのにこんなに地味 & シンプルでいいのかなと思いつつも、サクッと書いて公開しようという気になったのでしょうがない)
遭遇した問題
とある構造体(USTRUCT)にて FGuid
型のプロパティ Guid
を使っていたところ…パッケージ作成時に以下のエラーが出るようになりました(UE5.4環境)。
LogClass: Error: StructProperty FCollisionLimitDataBase::Guid is not initialized properly even though its struct probably has a custom default constructor. Module:KawaiiPhysics File:Public/KawaiiPhysicsLimitsDataAsset.h
実際のコードはこちら。うーん、初期化してるのになぁ…なんでや…
USTRUCT()
struct FCollisionLimitDataBase
{
GENERATED_BODY()
...
UPROPERTY()
FGuid Guid = FGuid::NewGuid();
対処方法
早速ググったり調べたところ、どうやら IgnoreForMemberInitializationTest
をUPROPERTYのmetaに追加すればいいみたいです。
UPROPERTY( meta=(IgnoreForMemberInitializationTest))
FGuid Guid = FGuid::NewGuid();
ちゃんと原因を調べるべきだとは思うのですが…エンジン内の各所でも同様の対応をしているのを見つけたので、「まあ、それならいいか!動けば良し!」となったので深掘りはせず
Engine\Plugins\FX\Niagara\Source\Niagara\Public\NiagaraTypes.h
UPROPERTY(VisibleAnywhere, Category = "Version Control", meta=(IgnoreForMemberInitializationTest))
FGuid VersionGuid = FGuid::NewGuid();
なおIgnoreForMemberInitializationTest
は、名前の通り、Structが持つ各プロパティが初期化されているか否かのチェックをスルーするためのものみたいです。
static void FindUninitializedScriptStructMembers(UScriptStruct* ScriptStruct, EScriptStructTestCtorSyntax ConstructorSyntax, TSet<const FProperty*>& OutUninitializedProperties)
{
...
for (const FProperty* Property : TFieldRange<FProperty>(ScriptStruct, EFieldIteratorFlags::ExcludeSuper))
{
#if WITH_EDITORONLY_DATA
static const FName NAME_IgnoreForMemberInitializationTest(TEXT("IgnoreForMemberInitializationTest"));
if (Property->HasMetaData(NAME_IgnoreForMemberInitializationTest))
{
continue;
}
簡単な内容ではありますが、少し混乱する挙動 & 解決方法なので記事にしてみました。少しでも参考になれば幸いですー!
参考:
https://forums.unrealengine.com/t/fs-test-id-is-not-initialized-properly/560690/7