LoginSignup
0
0

UE5 SubobjectDataSubsystem を使ってみる

Posted at

概要

UnrealEngine5 の SubobjectDataSubsystem を使ってみたメモです。
BPアセットのプロパティなどの変更ができるようです。

更新履歴

日付 内容
2023/06/01 初版

参考

以下の記事を参考にいたしました、ありがとうございます。
UE公式:Subobject Data Subsystem
[UE5] Blueprint ・Componentが持つプロパティのデフォルト値をSubobjectDataSubsystemを使って確認・変更する方法について

環境

Windows10
Visual Studio 2022
UnrealEngine 5.1.1

関連ソース

"Engine\Source\Editor\SubobjectDataInterface\Public\SubobjectDataSubsystem.h"
"Engine\Source\Editor\SubobjectDataInterface\Private\SubobjectDataSubsystem.cpp"
"Engine\Source\Editor\BlueprintEditorLibrary\Public\BlueprintEditorLibrary.h"

Blueprintアセットの変更

通常UEエディタで行うBPアセットのプロパティの変更ができるようです。

アクターのBPアセットの変数を書き換える

InObjectに指定のBPアセットを設定し、Gather Subobject Data For Blueprintでサブオブジェクトを取得、アクタークラスに対してTickInterval変数の変更をしています。

example01.png

アクターのBPアセットにコンポーネントを追加する

指定のBPアセットからルートコンポーネントを調べてAddNewSubobjectParamsで追加するコンポーネントのパラメータを作成し、Add New Subobject でコンポーネントを追加して Rename Subobjectでリネームしています。

example02.png

BlueprintアクターアセットのTick処理を切る

アクターのTickはゲーム中は SetActorTickEnabled()で切り替え可能ですが、Blueprintアセットではうまくいかない&完全にTick処理を切るために bStartWithTickEnabledfalseにしたいと思います。

Tickフラグ切り替え用メソッドをC++で用意します。

ActorのTickを切る処理
UFUNCTION(BlueprintCallable)
static bool SetTickDisable(AActor* _Actor) 
{
	if (_Actor->PrimaryActorTick.bStartWithTickEnabled) {
		_Actor->PrimaryActorTick.bCanEverTick = false;
		_Actor->PrimaryActorTick.bStartWithTickEnabled = false;

		return(true);
	}

	return(false);
}

これをつないで処理することでBlueprintアセット状態のアクターTick処理を切ることができます。
example04.png

実用する場合はアセットレジストリを使って検索対象のリストを作成してアクターやコンポーネントに対して StartWithTickEnable を切ると良いかと思います。
example03.png

PrimaryActorTick.bCanEverTick だけ false にすると継承したBlueprintでTickノードに処理をつなぐとTick処理がされるようです。完全にTick処理を行わないようにするには PrimaryActorTick.bStartWithTickEnabledfalseにする必要があるようです。

Componentアセットの作成

通常UEエディタで行うコンポーネントアセットの新規作成を行うことができるようです。元になるコンポーネントクラスがBP版とC++版で別メソッドとして用意されています。

CreateNewBPComponent

BPコンポーネントを新規作成します。
ComponentClassには基底となるBPコンポーネント、New Class Pathは作成するアセットのパス、New Class Nameは作成するアセット名を入力します。
CreateBP.png
上記例だと [All] -> [コンテンツ] に SkeletalMeshComponentを継承したSkeketalMeshComponent2 というアセットが新規作成されます。

CreateNewCPPComponent

コンポーネントのC++コードを新規作成します。
ComponentClassには基底となるC++コンポーネント、New Class Pathは作成するアセットのフルパス、New Class Nameは作成するアセット名を入力します。
CreateCPP.png
上記例だと [All] -> [C++クラス] -> [MyProject] に MyActorComponent というC++で作成したコンポーネントクラスを継承した MyActorComponent2 というC++クラスアセットが作成され、コンパイルされます。

まとめ

UEエディタで行っていた処理をBPで行えることが確認できました。コンポーネントの追加/削除などはあまり利用場面がないと思いますが、Blueprintアセットに対して処理を行えるのはプロパティの一括修正などで活用ができそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0