最近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つけてないと呼ばれません。
ビルドエラーにもならないのに呼ばれないのは罠っぽい。