UnrealEngineのUPROPERTY漏れのチェック


UPROPERTYとは

UEのC++側では、UObjectを継承したポインタ型のメンバー変数をUPROPERTY()属性をつけて保持しておかなければなりません。

class MYPROJECT_API MyClass : public UObject
{
    GENERATED_BODY()

private:

    UObject* NG; // GCに回収される恐れあり

    UPROPERTY()
        UObject* OK; // 安心
};

これはUEで採用されているガベージコレクション(以下、GC)が参照を保持するために使用しているからです。

UPROPERTY()をつけないで参照を持っているとGCに回収され、メモリアクセス違反などのエラーの原因になります。
またGCのタイミングの関係上、エディタで実行中は起きにくく実機で起きやすい、という傾向があります。

そのため、コードを書く時は絶対にUPROPERTYを付けるというコード規約のもとコードを書くのですが、こんなものは人間はどうしても忘れてしまいます。
そこでUPROPERTYの漏れチェックをCIに挟もうと思い、UESourceAnalyzerという名前でPropertyCheckできるようなものを作成しました。

取り急ぎ社内用に作ったのものを雑に公開してるものなので何も整えてないのですが、評判が良さそうならもうちょっと綺麗にします。

使い方

上記のGitHubのリリースからZIPを適当に展開して、中のexeに対してUEプロジェクトのSourceフォルダを引数に指定してあげてください。

PS K:\UESourceAnalyzer_Win64> .\UESourceAnalyzer.exe K:\UE4Test\Source

そうるすと、上記の場合はK:\UE4Test\Sourceの配下にPropertyCheck.txtというテキストファイルが吐かれます。
中身は以下のようになっており、

########################################
K:\UE4Test\Source\UE4Test\Core\CPP_GameInstance.h:19
------------------------------
private:

    static UCPP_GameInstance* Current; <<<<<<<<<<<<


########################################
K:\UE4Test\Source\UE4Test\Features\AsyncTask\AsyncTaskSubsystem.h:201
------------------------------
private:

    TArray<AsyncTaskCoreSystemBase*> CoreSystems; <<<<<<<<<<<<


########################################
K:\UE4Test\Source\UE4Test\Levels\WaitActorInitializing\WaitActorInitializingActor.h:18
------------------------------
private:

    UWaitActorInitializingActorComponent* WaitActorInitializingActorComponent; <<<<<<<<<<<<


########################################
K:\UE4Test\Source\UE4Test\Levels\AbilityTest\Actors\CPP_AbilityTestCharacter.h:22
------------------------------
private:

    UCPP_AbilitySystemComponent* AbilitySystem; <<<<<<<<<<<<



このような感じでUPROPERTYが抜けていそうな場所を、上下数行と合わせて一覧化して出してくれます。