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

PaperSloth’s diary

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

Unreal C++のすゝめ02

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

こんちは!


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

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

目次

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


Unreal C++入門( UPROPERTY編 )

・UPROPERTYとは
Unreal C++では変数定義した際にさまざまな設定ができます。
ネットワークに関する変数Replicationの設定、
BlueprintやLevelに公開するか、
BlueprintやLevelから編集可能かどうかです。

他にも設定可能なデータが沢山ありますが、今回はベーシックで簡単な物のみ紹介します。


・アクセス権限
簡潔に説明するためにちょっとした、略称で書かせていただきます。
Level → Level
Blueprint → BP
Read → R
Write → W
レベルエディター : 閲覧(Level R)
レベルエディター : 編集(Level W)
ブループリントエディター等 : 閲覧(BP R)
ブループリントエディター等 : 編集(BP W)

定義可能なアクセスに関するUPROPERTY一覧
- EditAnywhere :Level RW BP RW
- EditDefaultsOnly :Level BP RW
- EditInstanceOnly :Level RW BP
- VisibleAnywhere :Level R BP R
- VisibleDefaultsOnly :Level BP R
- VisibleInstanceOnly :Level R BP

記述例:

UPROPERTY(EditAnywhere)
    int EditAnywhere;


・Blueprintとの連携
UPROPERTY(BlueprintReadOnly) // Getのみ公開
UPROPERTY(BlueprintReadWrite) // Get・Set両方公開

記述例:

UPROPERTY(BlueprintReadOnly)
    bool ReadOnly;

この例の場合ですとLevelにもBlueprintにも表示がないため
Blueprint側から取得可能ですが、変数が定義されているのか分かりにくいです。


・カテゴリー分け
Blueprintから呼び出す際にどこに格納されているかを示すカテゴリです。
カテゴリ名は割りと何でもいいですが、わかりやすい名前を付けることをオススメします。

UPROPERTY( BlueprintReadOnly, Category = Foo )
    int foo;
UPROPERTY( BlueprintReadOnly, Category = "Foo" )
    int foo;

Categoryに定義する際は""を付けても付けなくても良いので、そこはお好みでどうぞ!

因みに

UPROPERTY( BlueprintReadOnly, Category = 'Foo' )
    int foo;

という記述をするとエラーとなります。

※追記 2016/06/21

呼び出しに階層構造を適用したい際の区切りは | となります。
記述例:Character.h 内の ACharacterの場合

UPROPERTY(BlueprintAssignable, Category="Pawn|Character")
    FCharacterMovementUpdatedSignature OnCharacterMovementUpdated;


下図のようになります。
f:id:PaperSloth:20160621145634p:plain
これで、Pawnの中のCharacterの中の変数という扱いになります。

また、Category指定がない場合について
Categoryを記述していない変数は
Valiables|クラス名 の中に格納されています。

記述例:Actorを基底としたMyActorクラスの場合

UPROPERTY(BlueprintReadWrite)
    int foo;

f:id:PaperSloth:20160621165022p:plain

・まとめ

Engineコードを見ると、UPROPERTYに色々とごちゃごちゃ書いていますが、
ひとつひとつを分解して読むと理解が深まりサクサク読めるようになると思います。

例えば、AActorクラスの中を見てみましょう。

/** The scale to apply to any billboard components in editor builds (happens in any WITH_EDITOR build, including non-cooked games). */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Rendering, meta=(DisplayName="Editor Billboard Scale"))
    float SpriteScale;

今回紹介していなかったmetaが使用されています。
DisplayNameというmetaですね。
これはSpriteScaleという変数名ですが、
Blueprintから呼び出す際にはEditor Billboard Scaleという名称で呼び出せます。

また、この変数の説明ですが、
こちらは #if WITH_EDITORONLY_DATA でくくられています。
そのため、Editorからしか使用できません。
この値を変えるとViewportで表示される画像のサイズが変更されます。



SceceComponentのScale1.0の例
f:id:PaperSloth:20160620185107p:plain

SceneComponentのScale5.0の例
f:id:PaperSloth:20160620185113p:plain


Unreal C++は素晴らC++

勿論ながら、大抵のジャンルのゲームやCGはBlueprintのみで構築可能ですし
パフォーマンスに関してもBlueprintで事足りることがほとんどです。
それでも、Unreal C++を使う必要が出てくる場面はいつかあるかもしれません。
そんな時は膨大なコードの海に怖気づかずにひとつひとつ要素を紐解いてコードを眺めてみましょう。


以上です!

ではまた!