0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TSubclassOfをSpawnActor時に使用する理由について【UnrealC++】

Last updated at Posted at 2024-09-22

結論

特別な理由が無く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クラス以外にも選択できてしまうためエラーの原因になりそうです。
    image.png
  • TSubclassOf < T >
    型安全の正体がわかりました。UClassで宣言した場合AProjectileクラス以外を選択しないことを祈るしかありませんが、TSubclassOf < T > を使用すると参照したいクラスのみがドロップボックスに現れてくれました。どちらを選んでもAProjectileクラスの機能は持っているのでエラーの原因にはならないでしょう。
    image.png
  • 普通の宣言
    オブジェクト参照なのでレベルにオブジェクトとして配置されたものしか参照できません。今回のような弾丸を発射する用途にはむきませんね

image.png

参考

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?