結論
特別な理由が無くC++のコード内でBPクラスを扱いたいならTSubclassOfを使おう!
ただなぜUClassを使わないほうがいいのかについては今回のような理由があるからぐらいは知っておいた方がいいと思います!
経緯
現在視聴しているUnrealC++動画内で以下のような説明をされました
UnrealC++内でBPクラスをスポーンするにはTSubclassOf < T > を使用します。
SubclassOfはTを格納するクラスではなくUClassを格納するクラスです。
次にTSubclassOf < T > について調べてみると
UClass型を型安全に扱うことができる
以上からわかるのは動画の説明は誤りでUClass型の変数であれば別にBPを扱えるということ。
ではなぜわざわざTSubclassOfを使うのか、型安全に扱えるって具体的にどういう影響があるのかと当然の疑問がわきました。
実際どうなるのか
今回は以下の三つの方法でどのような状態になるのかを見てみます。
//ABasePawn.h
//AProjectileは自作クラス
//UClass
UPROPERTY(EditDefaultsOnly, Category = "Combat")
UClass* UclassPointer;
//TSubclassOf
UPROPERTY(EditDefaultsOnly, Category = "Combat")
TSubclassOf<class AProjectile> ProjectileClass;
//普通の宣言
UPROPERTY(EditDefaultsOnly, Category = "Combat")
AProjectile* ProjectilePointer;
上からクラス参照、クラス参照、オブジェクト参照ですね。最後に関しては感覚で書くとこういう宣言しちゃうなと思って載せました。
結果
- UClass宣言
UClassを継承したクラスすべてが候補なので当然ですが大量の候補が出てきます。今回参照したいBPクラス以外にも選択できてしまうためエラーの原因になりそうです。
- TSubclassOf < T >
型安全の正体がわかりました。UClassで宣言した場合AProjectileクラス以外を選択しないことを祈るしかありませんが、TSubclassOf < T > を使用すると参照したいクラスのみがドロップボックスに現れてくれました。どちらを選んでもAProjectileクラスの機能は持っているのでエラーの原因にはならないでしょう。
- 普通の宣言
オブジェクト参照なのでレベルにオブジェクトとして配置されたものしか参照できません。今回のような弾丸を発射する用途にはむきませんね
参考