概要
UnrealEngine5 のC++にて CreateDefaultSubobject
で作成したコンポーネント等がそのBPオブジェクト上では nullptr
になることがあります。これは基本的な機能を親クラスのC++で作成し、運用はそれを継承したBPを使うケースにて稀に起こる現象と思われますが、この状態の復元を目指したメモ書きです。
更新履歴
日付 | 内容 |
---|---|
2025/07/03 | 初版 |
参考
[UE5] CreateDefaultSubobject で生成したものがNullになる問題
量産されたアセットのプロパティ仕様を変更する
コンポーネントが見えなくなる現象について
任意のアクターをC++で作成し、そのコンストラクタにてコンポーネントの作成を行いました。
UCLASS()
class AMyProject2Character : public ACharacter
, public IAbilitySystemInterface
{
GENERATED_BODY()
// ...省略...
public:
// コンポーネント
UPROPERTY(VisibleAnywhere)
TObjectPtr<class UAbilitySystemComponent> AbilitySystemComponent;
};
// コントラクタ
AMyProject2Character::AMyProject2Character()
{
// ...省略...
// コンポーネントの生成
AbilitySystemComponent = CreateDefaultSubobject<UAbilitySystemComponent>(TEXT("AbilitySystemComponent"));
}
その後、継承したBPでの作業や親クラスのC++を変更したりしていたところ、該当のコンポーネントの詳細が表示されなくなってしまいました。
このコンポーネントは nullptr
になっているらしく、Tickにて checkマクロを仕掛けるとここでブレークしてしまいました。
void AMyProject2Character::Tick(float DeltaTime)
> {
> Super::Tick(DeltaTime);
>
> check(AbilitySystemComponent);
> }
BPアセットがこのコンポーネントの値を nullptr
として持っておりそれがデシリアライズされた結果、このような状況になっているようです。
修正する方法について
BPを再度作成する
BPアセットを再度作成すると当然ながら確実に修正されます。しかしこの方法だと各種プロパティやBPコードなどは消えてしまうため手動でコピーする等の手間がかかります。他から参照されている場合、問題がでるかもしれません。
ブループリントの親クラスを変更する
BPの親クラスを変更する際にどうやらBPのシリアライズが行われるようなので、これを利用する方法でも良いようです。ただし変更した方の親クラスにないプロパティは当然消えるため一度、変更用のクラスを用意してから戻すということをすると手間はかかりますが安全です。

削除したコンポーネントの残骸がBPに残る現象について
こちらは最初の現象と逆で削除したコンポーネントがBP内に残ってしまうケースです、削除済コンポーネントを参照しようとして警告ログがでます。
こちらも親クラスの差し替え等で修正可能なようです。
まとめ
C++で基底クラスを作成しそれを親クラスとしてBPアセットを作る場合、C++クラス側の変更を行うとトラブルになるケースがあり、その解決を模索した結果です。
「アセット検証」というコンテキストメニューがあるのでここらへんで何とかできないものですかね。