読者です 読者をやめる 読者になる 読者になる

PaperSloth’s diary

Unity(C#)、UE4(Blueprint/C++)についての記事を書いたり日常のことをつぶやきます。

Unreal C++のすゝめ03

C/C++ UE4 プログラミング

こんちは!


今回はUnreal C++入門のお話その3です。
Unreal Engine4.11 段階での内容となります。

前回の内容はこちら
papersloth.hatenablog.com

目次

Unreal C++入門( UFUNCTION編 )
・まとめ


Unreal C++入門( UFUNCTION編 )

・UFUNCTIONとは
UPROPERTY同様にさまざまな設定ができます。
ネットワークに関するClient, Server, Reliableなどの設定、
Blueprintに公開するか、Overrideさせるか否かなど。

前回同様にベーシックで簡単な物のみ紹介します。

・Blueprintとの連携

Blueprintから呼び出し可能なUFUNCTIONの特徴として、Categoryの指定がないとエラーになります。

C++側のコードをBlueprintから呼び出す
・UFUNCTION(BlueprintPure, Category = Actor)
・UFUNCTION(BlueprintCallable, Category = Character)


C++側で用意した関数にBlueprintでロジックを組み込む
・UFUNCTION(BlueprintImplementableEvent, Category = foo)
・UFUNCTION(BlueprintNativeEvent, Category = var)

・BlueprintPure

Blueprintから呼び出す際に緑色で f と書かれたものです。
特徴としては実行ピンを持ちません。
また、戻り値が必要となるため void ですとエラーになります。
f:id:PaperSloth:20160621164628p:plain


記述例:

UFUNCTION(BlueprintPure, Category = Actor)
    bool PureFunction() const;

f:id:PaperSloth:20160621171034p:plain


・BlueprintCallable

Blueprintから呼び出す際に青色で f と書かれたものです。
特徴としては実行ピンを持ちます。
f:id:PaperSloth:20160621171535p:plain


記述例:

UFUNCTION(BlueprintCallable, Category = Niagara)
    void CallableFunction() const;

f:id:PaperSloth:20160621173025p:plain


・BlueprintImplementableEvent

C++で定義した関数をBlueprintで呼び出す際に使用します。
Blueprintに実装する仮想関数のようなもので、実装がない場合この関数呼び出しは無視されます。
BlueprintImplementableEventは少し特殊で引数、戻り値を持たない場合はイベントとして表示されます。
引数、戻り値があれば、関数をOverrideすることができます。
また、BlueprintImplementableEventsはC++で実装を定義できません。


記述例:引数、戻り値なしのEventの場合

UFUNCTION(BlueprintImplementableEvent, Category = Actor)
    void ImplementableEvent();

f:id:PaperSloth:20160621181549p:plain


記述例:引数、戻り値ありの関数の場合

UFUNCTION(BlueprintImplementableEvent, Category = Actor)
    bool Implementable(float var);

f:id:PaperSloth:20160621182521p:plain


・BlueprintNativeEvent

BlueprintImplementableEventと似ています。
BlueprintNativeEventにはC++の実装があり、Blueprintがその関数をOverrideしなければ呼び出されます。
Blueprintが実装しないデフォルトの挙動を、必要に応じてBlueprintでオーバーライドしたい場合に便利です。
BlueprintNativeEventをOverrideしても、必要に応じてC++側の実装を呼び出すことができます。
イベントまたは関数エントリノードからAdd call to parent を選択すると元の関数が呼び出せます。


・まとめ

Unreal C++は素晴らC++

C++からBlueprintに関数提供をすることは勿論ながら、
BlueprintからC++へのコミュニケーションもサポートされています。

しかしながら、BlueprintNativeEventなどは負荷がより多くかかるため、限定的な条件での実装を行うべきだと思います。

さて、どこまでがC++でどこからがBlueprintで良いのかという疑問をもたれている方も多いでしょう。

※ここからは私見ですので、鵜呑みにはしないでください。

複数人で開発する場合
・プロジェクトメンバーにアーティスト、企画職が多い場合はBlueprintのみでの開発をオススメします。
Blueprint"のみ"です。

というのも、C++とBlueprintを見境なしにごちゃごちゃと書いていくと同じ処理を両方に書いていたり、処理分けがぐちゃぐちゃになることが予想されるからです。


・プロジェクトメンバーにプログラマが多い場合はC++のみでの開発をオススメします。
プログラマの大半はC++に慣れ親しんでおり、ビジュアルスクリプトを嫌う人も多いでしょう。
「Blueprintだとパフォーマンス遅いから」
「スパゲティになるし、扱いにくい」
などなど、使ったことがない人は使う前から不平不満をこぼすことでしょう。(少しでも触れた人はBlueprintの魅力に魅了されていることでしょう)
文句を言い始めたら無理にBlueprintを覚えさせるよりもC++を触らせておけば静かになることでしょう・・・


さて、最後に

・あなたが個人開発者の場合

目的は同人ゲーム開発でも、勉強のためでも何でもいいです。

Blueprintのみでいいと思います。
先ずはそれで1本ゲームを完成させてみてください。
それでも勉強のため、興味があるからなど様々な理由でC++を書きたいという方も多いでしょう。

いきなり全てをC++に書くことはオススメしません。
例えば、面倒な計算処理をC++に移植してみてはいかがでしょうか。

ちょっとした練習問題も用意してみました。
こちらはContentExampleのOwenというCharacterのBlueprintです。
この計算ではAimOffsetに使用するためのYaw, Pitchを求めています。
こういった簡単な計算をBlueprintからC++に移植してみるところから初めてみてください。
f:id:PaperSloth:20160621205222p:plain


今回私はMyActorにそれっぽい形を用意しただけですので、実装はしておりませんが
最終的にこんな感じになると思います。
f:id:PaperSloth:20160621205945p:plain


以上です!

ではまた!