Unreal Engine触ってみたいけどビジュアルスクリプティングやりたくね〜〜って人向けの記事
最近Unreal Engine入門をしていて、頑張ってBlueprintを触ったりしてみているのですが、
「やっぱりC++の方が自分には向いてるな」となるわけです。
しかし、世の(特に日本語の)ブログ記事はBlueprintで作ってみました!というものが多く、
く〜〜〜これのC++コードをコピペさせてくれ〜〜〜となります。
というわけで、Blueprintの記事を読んでC++に変換できるようになりましょう。
変換方法を学ぶ
この記事で紹介したかったのはこれだけ。
Epicのラーニング内に「ブループリントを C++ に変換する」というドンピシャのコースがあり、
完全に日本語化もされています。2倍速で見れるのも嬉しい。
コースで教えてくれないこと
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つけてないと呼ばれません。
ビルドエラーにもならないのに呼ばれないのは罠っぽい。