ゲーム作りが大好きな人のブログ

ゲームを作るのが大好きな人のブログ。UE4とBlender、MAYA(LT)、3DCoatを使用しています!

【UE4】DefaultObjectを使ってアセットの初期値を取得

今回はDefaultObjectを使ってアセットの初期値を得る方法をご紹介します。

f:id:toofu0:20200420013651p:plain
 
 

そもそもDefaultObjectってなんスか。

各オブジェクトの雛形(テンプレート)となるデータのようです。

例えばBP上で
f:id:toofu0:20200420020728p:plain
上のようなTestAという変数を定義したとします。
この値の初期値は図にもある通り「64」です。

f:id:toofu0:20200420020902p:plain
そして上の図のような形でPrintStringします。
結果は「0」です。


さて、ここで元でセットしていた64に戻すにはどうすればよいか。
ここでDefaultObjectが出てきます。
f:id:toofu0:20200420021210p:plain
図にあるGetClassDefaultsにはBPで定義されたTestAがあります。
この中には初期値である64が入っています。
実行すれば64が返ってくる事が分かります。
 
 

ただし継承先で値を変更したものは取れない

BPの場合、継承を使うと上手く初期値が取得できないようです。
例えば先ほどのTestAを持ったブループリントを継承したクラスを新規作成したとします。そして継承先クラスで初期値を「32」とセットしてもGetClassDefaultsで返ってくる値は「64」となります。
どうやらアセット単位の初期値しか見れないようです。
 
 

C++の場合はある程度融通が利く

次はC++です。
AMyTestというクラスを用意し、TestAというUPROPERTYが付いたfloat型の値を定義したとします。
この初期値を取る方法は下記です。

float AMyTest::GetDefaultValue_TestA()
{
	AMyTest* pDefault = GetClass()->GetDefaultObject<AMyTest>();
	return pDefault->TestA;
}

継承先で値を変更したとしてもキッチリ初期値が取れるのがメリットです。
BP側で初期値を変更したとしても取れます。
ただしBP側で定義した変数を取得する場合はこの方法では無理です
※ 多分出来そうですが現状試していません。設計も煩雑になりそうなので。
 
 

まとめ

今回は初期値を取る方法でしたが
この辺りを知っておけばバグが少なく最小限のコードで
初期値を取得することが可能です。
有効に活かしていきたいですね。それでは!