johnnyGameStudio’s blog

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

【UE4】「え?それで取得できるの?」と思ったAssetやクラスのGet周りのまとめ【C++】

この記事はUnreal Engine 4(UE4) Advent Calendar 2019の4日目の投稿記事です

qiita.com

はじめに

元々UE4C++でのゲームAIについて書いていましたが、諸事情により完成しませんでした・・・
なので大したネタじゃないです、すみません
変わりにUE4C++で開発していて「え?これでインスタンス取得できるの?」と思ったGet系をまとめてみました
初心者向けでよろしくお願いします
公式ドキュメントのどこかに書かれているかもしれないですけど、まぁご容赦ください

Asset系取得

FObjectIterator

Module include
CoreUObject #include "UObject/UObjectIterator.h"

ディレクトリにあるAssetを全検索して名前で引っ張ってこれるので「大丈夫なのかこれ?正しいのか?」と不安になるコード

void ASampleActor::BeginPlay()
{
    UBlackboardData* bbData;
    for (FObjectIterator It(UBlackboardData::StaticClass()); It; ++It)
    {
        UBlackboardData* obj = (UBlackboardData*)*It;
        if (obj->GetFName().IsEqual("Sample_BB"))
        {
            bbData = obj;
            break;
        }
    }
}

クラスの取得・生成

MakeShareable

ぶっちゃけ公式ドキュメントに普通に書かれているんですけど、全然存在に気づかなかったです
MakeShareableを覚えてからはこっちのほうが楽なので「ふ~ん、便利じゃん」となりました

void ASampleActor::BeginPlay()
{
    Super::BeginPlay();
    TSharedPtr<OriginalClass> hoge = TSharedPtr<OriginalClass>(new OriginalClass());//これと同じ
    TSharedPtr<OriginalClass> hoge = MakeShareable(new OriginalClass());
}

GetComponentsByClass

そりゃこういうAPIはあるよねって感じだけど、複数形の名前じゃないからてっきり1個しか取得できないと思っていたのにさりげなく複数取得できたのでちょっと混乱した
空目していただけで元々複数形だった。俺の目は節穴か

void ASampleActor::BeginPlay()
{
    Super::BeginPlay();
    TArray<UActorComponent*> compArray = GetComponentsByClass(USampleComponent::StaticClass());//複数
    UActorComponent* comp = GetComponentsByClass(USampleComponent::StaticClass());//先頭1個
}

CastChecked< T >

UObjectを継承しているdynamic_cast相当の型変換はCastを使用しますが、CastCheckedはもしnullptrが入る場合にはエラーログを吐いたうえで停止します
「こいつがCastできないわけないが、もしnullptrが返ってきてたらわかるようにしておきたい」という場合に便利だなぁと思いました

void ASampleActor::Hoge(AActor* actor)
{
    AFooActor* fooActor = CastChecked<AFooActor>(actor);
}