UEの森の一筋

Unreal Engineを深く理解していく上で学んだ知見を整理したいと考えています.

【Unreal Engine】C++でつくる Unreal Engineアプリ開発 for Windows & macOSを読む

目的

C++でつくる Unreal Engineアプリ開発 for Windows & macOS(以下,本書)」を読むことにしたので,読む最中の気づきや疑問点などをメモしていきます.
章・節によって粒度がまちまちになる気がしますが,気分の問題なので許してください.
尚,今回は3章から読むこととし,必要に応じて遡ろうと思います.3章から読もうと考えた理由は特別なく,直感です.
尚,以下では次の記法を汎用的に利用します.

  • [補]:原著に記述はなく,私の独自解釈が含まれる言明.

本記事で扱う範囲

本記事では3章のリード文と3章1節を扱います.3章は3節構成になっていますが,3章1節は続く4章,5章の導入にもあたる内容になっているように見受けられます.3章1節は具体的に.cppファイルを作成する場合に標準的に作成することになる.hファイルの記法を示しており,各特長が3章以降のどこで扱うことになるかを明示しています.一方で3章2節と3章3節では,Blueprintから呼び出しうる函数を作成するという具体的な目標に絞ってワークフローの説明がなされています.よって二つに分割する場合はここになるであろうと考えた次第です.
このように捉えると3章自体が4章および5章の各論に進むうえでの導入として用意されているように感じますので,あまり深入りせず,疑問点は疑問点として残して進もうと考えています.

3章

本書では独自定義の用語を用いているようなので,記事を将来読み返す際の備忘録のために記録しておきます.

3章の内容としては次の通り.

  • UE C++に特徴的なヘッダファイルの例
  • UE C++函数のBlueprint定義
  • Blueprint函数を定義する場合の具体的な手続き

3章1節

本節ではUE C++のヘッダファイルの具体例が明示され,その特異性が説明されています.その後,コラムに於いてはUnreal Engineに於けるownerとparentの違いについて説明されています.
本書ではMyAppCalculator.cppを作成する場合の記述を紹介していますが,ここでは写経を避け,test.cppを作成する場合の記述を例として用います.以下ではtest.cppを最初に記し,特徴的な行について,後から特筆して補足します.

#import "Engine.h"
#import "test.h"
#import "test.generated.h"
UCLASS()
class Utest : public UObject {
GENERATED_BODY()
public:
    UPROPERTY(BlueprintReadWrite, Category  = "newCategory")
    int32 intProperty;
    UFUNCTION(BlueprintCallable, Category  = "newCategory")
    float LengthOfSomething(const int32 index);
private:
    TArray<int> IntArray;
};
UE ライブラリの例
#import "Engine.h"

Engine.hはUE ライブラリのうち最も標準的なものです.

UE C++に於けるインポート
#import "test.h"
#import "test.generated.h"

test.cppを作成する場合,対応するヘッダファイルtest.hを作成し,インポートします.次に書くUCLASS()マクロを使用する場合,インポートが必須になります.実際,インポートしない場合はビルド時に

test.cpp(1): error : Expected test.h to be first header included.

といったエラーが返ります.尚,test.generated.hUnreal Engineのビルド系統の一つである,Unreal Header Toolが自動的に生成します.Unreal Engineのビルド系統はこれ自体別の記事にするべき事柄だと感じているのですが,Unreal Build ToolとUnreal Header Toolとがまず動いていることは先に知っていてもよいと感じます.

UE C++に於ける固有のマクロ(1)
UCLASS()

UCLASS()C++に於けるマクロです.よってビルド時,前処理の段階でUnreal Engine固有のコードに置換されます.UCLASS()マクロと呼ばれるようです.

UE C++に於けるクラス名の命名規則と継承
class Utest : public UObject {

test.cppを作成しているわけですが,ここで定義されるクラスはUtestであることに注意しましょう.Unreal Engineの公式文書を参照すると

Extend from the base class of all gameplay objects. These cannot be directly instanced into the world; they must belong to an Actor. These are generally objects like Components.

とあり,gameplay objectクラスを継承する場合は接頭辞Uを付けることになっているようです.Unreal Engineのビルドツールを利用する場合,どのクラスから継承すべきかが分かっていないので,このあたりは優先的に調査が必要です.

UE C++に於ける固有のマクロ(2)
GENERATED_BODY()

GENERATED_BODY()C++に於けるマクロです.Engine\Source\Runtime\CoreUObject\Public\UObject\ObjectMacros.hに定義が書いてあるようですが,詳細は終えていません.要調査.

UE C++に於ける宣言(1)
public:
    UPROPERTY(BlueprintReadWrite, Category  = "newCategory")
    int32 intProperty;
    UFUNCTION(BlueprintCallable, Category  = "newCategory")
    float LengthOfSomething(const int32 index);

UPROPERTY()C++に於けるマクロです.インスタンス変数を宣言する直前に挿入するようです.引数を二つ取り,第一引数ではBlueprintから使用可能かといった権限の管理に利用され,第二引数はプロパティ指定子を渡すことでBlueprint側からどのように制御できるかを指定できるようです.これも要検証・要調査.特に,この文脈に於けるメタデータとプロパティ指定子の差異もあまり理解できていないので,これは優先的に調査が必要です.
このようにUPROPERTY()はUE エディタと連携を取る際のプロパティを定義することができますが,参照がある限り自動的にガベージコレクションが利かないようにするといった機能があるようです.このあたりはソースコードを具体的に読まないと分からないので,一旦保留することにします.
UFUNCTION()C++に於けるマクロです.メソッドを宣言する直前に挿入するようです.UPROPERTY()とほとんど同様と理解しています.

UE C++に於ける宣言(2)
private:
    TArray<int> IntArray;

TArrayはUE ライブラリで定義されている可変長配列であり,これの宣言です.この記述でTArray型のインスタンス変数IntArrayが宣言できています.

参考:UnrealBuildTool勉強会まとめ
参考:UE4とUnrealC++について
参考:UE4 C++ビルドエラー対応覚書 - ハッカーと同人作家
参考:Gameplay Classes | Unreal Engine Documentation
参考:Gameplay Classes | Unreal Engine Documentation
参考:プロパティ メタデータ指定子のメモ - お醤油をこよなく愛するニワトリの備忘録
参考:[UE4] meta情報を活用しエディタでの動作を制御しよう!|株式会社ヒストリア
参考:プロパティ指定子 | Unreal Engine ドキュメント
参考:凡人の活動記録: UE4のUObjectを継承したオブジェクトについて
参考:[Unreal C++]意図しないガベージコレクションを起こす
参考:アンリアルでのオブジェクト処理 | Unreal Engine ドキュメント
参考:UE4 C++コードをブループリントで使えるようにする(アクタークラス編) - Let's Enjoy Unreal Engine
参考:Unity 引っ越しガイド | Unreal Engine ドキュメント
参考:コーディング規約 | Unreal Engine ドキュメント
参考:Unreal Engine 4メモ:structの接頭辞が「F」の理由 - Qiita
参考:std math function ? - #3 by Antares - C++ Programming - Unreal Engine Forums

最後にコラムに於いて,次のように記述されています.

オブジェクトの所有関係を示すのがownerで、そのオブジェクトを所有しているオブジェクトを示します。幾何的な従属関係を示すのがparentで、そのオブジェクトが従属しているオブジェクトを示します。

正直,この記述の意味は全く分かりませんでした.具体的には次の疑問が生じ,解決できていません.本書を読み進める間で解決し次第あらためて記事にしようと思います.

  • この文脈に於けるオブジェクトは,UObjectのことでよいのか.
  • 所有関係とは何か.同様に従属関係とは何か.相違点が不明.