C++幼女先輩

プログラミング成分多め

UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part2 構造体、enum、メンバ変数

最初に

プロジェクトは BluePrintのThirdPersonExanmple プロジェクト名:BPTest C++クラス: MyActor 派生したBluePrintクラス:BP_MyActor

を作成する 作成したクラスを元にリフレクションを調査

構造体

構造体をBluePrintと両方で使いたい場合は、基底クラスのC++側で リフレクション付けて定義します

コード

Class宣言の前に

USTRUCT(BlueprintType)
struct BPSAMPLE_API FHogeStruct {
    GENERATED_USTRUCT_BODY()

public:
    UPROPERTY() float x;
    UPROPERTY(BlueprintReadOnly)    float y;
    UPROPERTY(BlueprintReadWrite)   float z;
};

名前

今回の構造体名は FHogeStruct 構造体は頭に Fのプリフィックスを付けねば認識してくれないのは Unrealの仕様

USTRUCT()

BluePrintに公開するときに必要 ただし、これだけではガーベージコレクションに入らないので、メンバ1つずつに対して UPROPERTY設定必要

パラメータは下記 https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Structs/Specifiers/index.html

UPROPERTY()

メンバそれぞれに対して、BluePrintにリフレクションするパラメータを設定する 今回は3種類書いてみた パラメーター無し、BlueprintReadOnly、BlueprintReadWrite 結果から言うと パラメータ無しだと Blueprintに公開されない BlueprintReadOnlyだと 書き込み不能 BlueprintReadWrite だと読み書き可能 みた通りの挙動

パラメータ詳細は下記 https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Properties/Specifiers/index.html

BluePrintでの結果

BP_MyActorのブループリントを開き、HogeStructのノードを開く

f:id:murasame-labo:20160907180419p:plain

見て分かる通り、IN (書き込み)は Zのみ、OUT(読み込み)はYとZで、Xは読み書きどちらも不能

これで 構造体をBluePrintとC++で使えるようになった

Enum

EnumをBluePrintと両方で使いたい場合は、基底クラスのC++側で リフレクション付けて定義します

コード

Class宣言の前に

UENUM(BlueprintType)
enum class EHogeEnum : uint8 {
    HOGE,
    HOGE2,
    HOGE3
};

名前

今回の構造体名は EHogeEnum Enumは頭に Eのプリフィックスを付けねば認識してくれないのは Unrealの仕様 また、内部表現は8ビット固定

UENUM()

BluePrintに公開するときに必要

BluePrintでの結果

BP_MyActorのブループリントを開き、HogeEnumのノードを開く

f:id:murasame-labo:20160907182152p:plain

これで EnumをBluePrintとC++で使えるようになった

メンバ変数

メンバ変数をBluePrintに公開するには、基底クラスのC++側で リフレクション付けて定義します

コード

Class

UCLASS(Blueprintable)
class BPSAMPLE_API AMyActor : public AActor
{
    GENERATED_BODY()
    
private:
    // UPROPERTY(BlueprintReadWrite, Category = "MyTest")    float private_;    // privateではアクセスを書くとコンパイルエラー
    UPROPERTY() float private_;

protected:
    UPROPERTY(BlueprintReadOnly, Category = "MyTest")    float protected_;


public:   
    UPROPERTY(BlueprintReadWrite, Category = "MyTest")   float public_;

    // Sets default values for this actor's properties
    AMyActor();

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;
    
    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;

};

UPROPERTY()

構造体の時と同じく、BlueprintReadOnly、BlueprintReadWrite を選べる また、Categoryをつけると、BluePrintでノードを検索するときに カテゴリー名で検索できるので便利 Privateの場合は BluePrintから呼び出せないため、それらのパラメータを付けることは不可能

パラメータ詳細は下記 https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/Reference/Properties/Specifiers/index.html

BluePrintでの結果

private 変数はアクセス不能 protected 変数はアクセス可能 public_ 変数はアクセス可能

f:id:murasame-labo:20160907184439p:plain

関数については次!