johnnyGameStudio’s blog

無能なゲームプログラマのぼやき ぎーくになりたい Twitter: https://twitter.com/JGS_Developer

【UE4】BPに公開している関数の引数に使う構造体にデフォルト引数を使いたい【C++】

はじめに

開発をしていてBPに公開されている関数に構造体を追加する必要が出たときにこの現象にぶつかりました
色々調べましたがエラー内容で検索してもドキュメントにも原因が明記されているところは見当たらなかったので解決方法をまとめておきます

デフォルト引数が使えない

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestActor.generated.h"

USTRUCT(BlueprintType)
struct FActorInfo
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "hoge")
    int32 num;

};


UCLASS()
class SANDBOX_API ATestActor : public AActor
{
    GENERATED_BODY()
    
public: 
    // Sets default values for this actor's properties
    ATestActor();

    UFUNCTION(BlueprintCallable, Category = "TestActor")
    void TestFunc(const FActorInfo& info = FActorInfo());//コンパイル時にエラーが出る

};

上記のように書くと以下のようなコンパイルエラーが発生します

重大度レベル   コード   説明  プロジェクト  ファイル    行 抑制状態
エラー       C++ Default parameter not parsed: info "FActorInfo()"   Sandbox C:\UE4_Prj\Sandbox\Source\Sandbox\TestActor.h   30  

原因の推察

C++のルール的には記述の問題ではない(UFUNCTIONコメントアウトするとコンパイルが通る)ことから考えてもUE4ならではの状況なのは間違いないです
ということは,BPとして公開することに原因がありそうです
BPのデフォルト引数はmetaデータとして埋め込むことが可能であることを考えると構造体のデフォルト値をコンパイル時に取得できていない?

解決方法

metaデータにデフォルト引数を持たせることで解決できます
関数の定義を以下のように書き換えましょう
デフォルト引数が設定されているのでBPでピンを繋げていなくてもエラーは出ません

UFUNCTION(BlueprintCallable, Category = "TestActor", meta = (AutoCreateRefTerm = "info"))
void TestFunc(const FActorInfo& info);

image.png

試しに以下のようにmetaデータを削除してみるとエラーがでることが確認できる

UFUNCTION(BlueprintCallable, Category = "TestActor")
void TestFunc(const FActorInfo& info);

image.png

所感

根本の理由はちゃんと追っていないので、詳細な理由がわかる人がいたら教えてください