UE4においてC++のコンストラクタで生成したコンポーネントの詳細が消える現象についての検証


概要

下記画像のように、C++でのコンストラクタで生成したコンポーネントの詳細が消えることがたまにあります。
これはブループリントエディタ、レベルエディタ上の両方で生じます。

対処法としてアクタのブループリントの親クラスを一旦他のものに切り替えて戻すと治りますが、パラメータが吹っ飛ぶので手間です。
今回はその原因について検証してみました。

検証内容

コンストラクタでリネームしたりコンポーネントの種類を変えたりしたときによく起こる気がするので、
それぞれの状況についてどのような挙動をするのか確かめてみます。
今回試すのは

  • 変数名のリネーム
  • コンポーネントの名前のリネーム
  • コンポーネントのクラスの変更

となります。

検証

まずはリネームなどをする前の状態です。

// ルートシーン
rootScene = CreateDefaultSubobject<USceneComponent>(FName(TEXT("RootScene")));
RootComponent = rootScene;

// 変数名を変えるコンポーネント
before = CreateDefaultSubobject<USceneComponent>(FName(TEXT("TestSceneName")));
before->SetupAttachment(RootComponent);

// コンポーネント名を変えるコンポーネント
testSceneComponent = CreateDefaultSubobject<USceneComponent>(FName(TEXT("BeforeComponentName")));
testSceneComponent->SetupAttachment(RootComponent);

// コンポーネントのクラスを変えるコンポーネント
componentChange = CreateDefaultSubobject<USceneComponent>(FName(TEXT("ComponentChange")));
componentChange->SetupAttachment(RootComponent);

このクラスを継承したアクタを生成してみます。
この時点では当然ですが、各コンポーネントとの詳細パネルを確認できます。

次に各コンポーネントをリネームなどをしてみます。

// ルートシーン
rootScene = CreateDefaultSubobject<USceneComponent>(FName(TEXT("RootScene")));
RootComponent = rootScene;

// 変数名を変えるコンポーネント
after = CreateDefaultSubobject<USceneComponent>(FName(TEXT("TestSceneName")));
after->SetupAttachment(RootComponent);

// コンポーネント名を変えるコンポーネント
testSceneComponent = CreateDefaultSubobject<USceneComponent>(FName(TEXT("AfterComponentName")));
testSceneComponent->SetupAttachment(RootComponent);

// コンポーネントのクラスを変えるコンポーネント
componentChange = CreateDefaultSubobject<UBoxComponent>(FName(TEXT("ComponentChange")));
componentChange->SetupAttachment(RootComponent);

変更点は以下のとおりです。

  • 変数名before→afterに
  • コンポーネント名BeforeComponentName→AfterComponentName
  • コンポーネントのクラスをUSceneComponent→UBoxComponent

にしてみました。
すると以下のようになりました。

結論

変数名は同じでコンポーネント名を変えると詳細パネルの表示が消えてしまうようです。
コンポーネントの内容がコンポーネント名をベースに保存されているからでしょうか。

コンポーネントの名前を変えるときは変数名も変えるなどをすれば起きなくなるのでそうするのが吉かもしれません。
もし詳細が消えてしまった場合も、コンポーネントの名前をもとに戻せば復活します。

逆に考えると、古いコンポーネントの名前で設定した内容が残っているかと思うとやや不安ではありますね…。
名前はよく考えて決めたほうが良さそうです。