C++幼女先輩

プログラミング成分多め

UnrealEngine4 最初にBluePrintとのリフレクション部分を調べる part3 メソッド

最初に

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

前回、構造体、Enum、メンバ変数のリフレクションを調べたので 今回は関数のリフレクション

基本的にはリフレクション入門はこれで終わりかな?

関数

関数のリフレクションは、UFUNCTIONを使うが この時のパラメータにより挙動が大きく異なるので よく使われるものをのせる

パラメータ一覧

下記をみるとよい

https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/Reference/Functions/index.html

パラメータ無し

 UFUNCTION(Category = "MyFunc")
        virtual void FuncNone() {};
    UFUNCTION(Category = "MyFunc")
        virtual void FuncNone2(int n) {};
    UFUNCTION(Category = "MyFunc")
        virtual int FuncNone3(int n) { return 1; };

パラメータを付けない場合は、BluePrintと繋がることはない だが、後に出てくる レプリケーション等のUnrealEngineで使う関数には指定する必要がある

BluePrintCallable

 UFUNCTION(BluePrintCallable, Category="MyFunc")
        virtual void FuncCallable() {};
    UFUNCTION(BluePrintCallable, Category = "MyFunc")
        virtual void FuncCallable2(int n) {};
    UFUNCTION(BluePrintCallable, Category = "MyFunc")
        virtual int FuncCallable3(int n) { return 1; };

BluePrintからC++のコードを実行する際に使う、最も多い使い方 基本的にUnrealではC++のクラスを継承しBluePrintを作る BluePrintで関数を Override可能

BlueprintImplementableEvent

 UFUNCTION(BlueprintImplementableEvent, Category = "MyFunc")
        void FuncImplementableEvent() ;
    UFUNCTION(BlueprintImplementableEvent, Category = "MyFunc")
        void FuncImplementableEvent2(int n);
    UFUNCTION(BlueprintImplementableEvent, Category = "MyFunc")
        int FuncImplementableEvent3(int n);

C++からBluePrintの関数を呼ぶための仕組み 名前から推測するに イベントのような形で実行するのだろう 実際にBluePrintでもイベントとして表示される

virtual不可能&C++側で関数をImplement不可能 関数定義だけ用意し、C++からこのコードを呼べば、BluePrintで定義した関数が呼べる イベントなので 引数は取れるが戻り値は返せない コンパイルエラーにはならないが、戻り値をつけるとBluePrintから見えなくなる

BlueprintPure

//  UFUNCTION(BlueprintPure, Category = "MyFunc")
//     virtual void FuncPure(){};
// UFUNCTION(BlueprintPure, Category = "MyFunc")
//     void FuncPure2(int n) {};
    UFUNCTION(BlueprintPure, Category = "MyFunc")
        virtual int FuncPure3(int n) { return 1; };

ヘルプによると 所有するオブジェクトに影響を与えることなく・・・ らしく、戻り値がなければダメのようだ

結果

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

パラメータ無しはBluePrintに表示されない ImplementableEventは イベントとして表示。ただし戻り値を設定すると表示されない Callableは実行品が両端についた通常の関数 Pureは実行ピンのない、値をかえすだけのもの

これでBluePrintとのリフレクションの基礎は一通りおわった