Unreal Engine触ってみたいけどビジュアルスクリプティングやりたくね〜〜って人向けの記事

最近Unreal Engine入門をしていて、頑張ってBlueprintを触ったりしてみているのですが
「やっぱりC++の方が自分には向いてるな」となるわけです。

しかし、世の(特に日本語の)ブログ記事はBlueprintで作ってみました!というものが多く、
く〜〜〜これのC++コードをコピペさせてくれ〜〜〜となります。

というわけで、Blueprintの記事を読んでC++に変換できるようになりましょう。

変換方法を学ぶ

この記事で紹介したかったのはこれだけ。
Epicのラーニング内に「ブループリントを C++ に変換する」というドンピシャのコースがあり、
完全に日本語化もされています。2倍速で見れるのも嬉しい。 dev.epicgames.com

コースで教えてくれないこと

Z_Construct_UClass_*_NoRegister というエラーが出る

上記のコースで学んで、「よし!QuartzのサンプルをC++移植してみるぞ!」と思い、ヘッダーに

UPROPERTY(EditAnywhere, BlueprintReadWrite)
UQuartzClockHandle *ClockHandle;

と、メンバーを追加しただけでコンパイルエラーが出ました。
なんでやねん。

Z_Construct_UClass_ASandboxActor_Statics::NewProp_ClockHandleCpp in SandboxActor.gen.cpp.o
  "Z_Construct_UClass_UQuartzClockHandle_NoRegister()", referenced from:

このエラーはC++コード生成時(.gen.cpp生成時)にモジュールの参照が足りてない時に出るらしく、
Source/Sandbox/Sandbox.Build.cs の(突然ここでC#出てくんの凄くない?)

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

にモジュールを追加してやる必要があります。
え、これドキュメントのどこに書いてあるの?

モジュール名の調べかたは、使いたいclass/struct(今回はUQuartzClockHandle)の実装を見ると書いてあります。
今回の場合はAudioMixerだったので

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AudioMixer" });

こんな感じに追加するとビルドが通るようになります。

DYNAMIC_DELEGATEに関数を登録してもUFUNCTIONがついてないと呼ばれない

ちゃんと上で説明したコース内で紹介されてました!!!

FOnQuartzMetronomeEventBP OnQuantizationEvent;
OnQuantizationEvent.BindDynamic(this, &ASandboxActor::MyQuantizationEvent);
ClockHandleCpp->SubscribeToQuantizationEvent(
    this,
    EQuartzCommandQuantization::Bar,
    OnQuantizationEvent,
    ClockHandleCpp
);

こんな感じでMyQuantizationEventを登録した時、MyQuantizationEventの定義にUFUNCTIONつけてないと呼ばれません。
ビルドエラーにもならないのに呼ばれないのは罠っぽい。