通常のc++ではクラスと構造体に違いがあまりない
ただしstructはデフォルトのアクセシビリティがpublicなのに対しクラスはprivateになる
struct HogeStruct
{
float funcA();
private:
int32_t a;
float b;
};
class FugaClass
{
public:
float funcB();
private:
int32_t c;
float d;
};
上記のような違いしかないため使い分けは開発者の好みになるが、UnrealC++では明確な使い分けが指定されている。
インスタンスを値として扱う→構造体、列挙体
インスタンスをポインタ経由で扱う→クラス
このルールに従うことでUnrealC++の強力なガベージコレクションやプロパティを利用できる。
クラスはUObjectを継承する。
クラスのインスタンスへはポインタ経由でアクセスされる。
いかにAActorクラスを継承したクラスのヘッダファイルの例を示す。
#progma once
#include "GameFramework/Actor.h"//継承したクラスのヘッダ
#include "CppExampleStruct.h"
#include "CppExampleEnum.h"
#include "CppExampleActor.generated.h"//UHTによって生成されるファイル、マクロなどに必要
//UEライブラリと連携するために必要なマクロ
//このマクロに引数を指定することでクラスの性質を指定できる
//今回はBlueprintTypeと指定することでこの型がBlueprintの変数のものとして使えるようになった
UCLASS(BlueprintType)
class ACppExampleActor : public AActor{
GENERATED_BODY() //必ずクラスの冒頭に必要なマクロ
public:
//BlueprintReadWrite : ブループリント上で読み書き可能
//EditAnywhere : レベル上からでもエディタ上でもどこでも編集可能
UPROPERTY(BlueprintReadWrite,EditAnywhere,Category = "UECppBook")
FCppExampleStruct MyStructProp;
UPROPERTY(BlueprintReadWrite,EditAnywhere,Category = "UECppBook")
ECppExampleEnum Type;
//BlueprintCallable : ブループリントから呼び出し可能
UFUNCTION(BlueprintCallable,Category = "UECppBook")
float MyActorFunc(const float Input);
}
構造体も継承元を指定することはできるが、今回はしなかった。
クラスとの大きな違い