UE 4:4種類のリソースのロード方法
4422 ワード
変換元:https://blog.csdn.net/zhangxsv123/article/details/79707686
1つ目は、青写真にC++クラス(またはC++クラスから作成された青写真)がある場合、直接ロードします.
すべてのリソースをロードしてシーンに作成する方法はSpawnActorというコードから離れられない.青写真にC++クラスが含まれている場合は、クラスのStaticClassに直接アクセスできます.
残りのロード方式はすべて単純なロード青写真で、対応するC++クラスはありません
2つ目:ConstructorHelpersによるロード
FclassFinderは構造体であり、Classメンバー変数はTSubClassofタイプである.SpawnActor(bpClass.Class)だけで必要なものを生成できます
しかし、この方法はクラスの構造関数でしか使用できず、通常の論理コードにこのコードをネストすると、コンパイラ全体のcrashを引き起こす可能性が高い.以下に、コードの具体的な実行手順を示します.
この方法は最初のところで構造関数にあるかどうかを先にチェックしていることがわかる.CheckIfIsInConstructor、そうでなければcrashを引き起こす可能性がある(具体的な原因は不明)...次に、ロードするクラスをパスで見つけて返します.もう一つ、この変数はstaticでなければなりません.
3つ目:FStringAssetReferenceでロード
FStringAssetReferenceクラスの役割は主に1つの文字列を通じて、その文字列に対応する資源を見つけることである.あるいは、指定されたリソースによって、そのリソースに対応するプロジェクト内のパス、すなわち前述の文字列を見つける.
そのうち、asset.ResolveObjectは文字列に対応するリソースを検索し、UObejctを返します.Ublueprintタイプに変換してから、彼のGenerateClassに行けばいいです.
4つ目:StaticLoadObjectによるロード
原理はほとんど3つ目と同じです.呼び出しの仕方が違うだけだ.ここでは余計なことは言わない.
まとめると、第3種と第4種が最も通用するはずだ.第1の要求には対応する青写真C++クラスがあり、第2の要求には必ずコンストラクション関数で完了する(誰のコンストラクション関数でもよいが、この方法はコンストラクション関数でしか呼び出せない)...
1つ目は、青写真にC++クラス(またはC++クラスから作成された青写真)がある場合、直接ロードします.
ATemp* spawnActor = GetWorld()->SpawnActor(ATemp::StaticClass());
すべてのリソースをロードしてシーンに作成する方法はSpawnActorというコードから離れられない.青写真にC++クラスが含まれている場合は、クラスのStaticClassに直接アクセスできます.
残りのロード方式はすべて単純なロード青写真で、対応するC++クラスはありません
2つ目:ConstructorHelpersによるロード
static ConstructorHelpers::FClassFinder bpClass(TEXT("/Game/BluePrint/TestObj"));
if(bpClass.Class != NULL)
{
GetWorld()->SpawnActor(bpClass.Class);
}
FclassFinderは構造体であり、Classメンバー変数はTSubClassofタイプである.SpawnActor(bpClass.Class)だけで必要なものを生成できます
しかし、この方法はクラスの構造関数でしか使用できず、通常の論理コードにこのコードをネストすると、コンパイラ全体のcrashを引き起こす可能性が高い.以下に、コードの具体的な実行手順を示します.
struct FClassFinder
{
TSubclassOf Class;
FClassFinder(const TCHAR* ClassToFind)
{
CheckIfIsInConstructor(ClassToFind);
FString PathName(ClassToFind);
StripObjectClass(PathName, true);
Class = ConstructorHelpersInternal::FindOrLoadClass(PathName, T::StaticClass());
ValidateObject(*Class, PathName, *PathName);
}
bool Succeeded()
{
return !!*Class;
}
};
この方法は最初のところで構造関数にあるかどうかを先にチェックしていることがわかる.CheckIfIsInConstructor、そうでなければcrashを引き起こす可能性がある(具体的な原因は不明)...次に、ロードするクラスをパスで見つけて返します.もう一つ、この変数はstaticでなければなりません.
3つ目:FStringAssetReferenceでロード
FStringAssetReference asset = "Blueprint'/Game/BluePrint/TestObj.TestObj'";
UObject* itemObj = asset.ResolveObject();
UBlueprint* gen = Cast(itemObj);
if (gen != NULL)
{
AActor* spawnActor = GetWorld()->SpawnActor(gen->GeneratedClass);
}
FStringAssetReferenceクラスの役割は主に1つの文字列を通じて、その文字列に対応する資源を見つけることである.あるいは、指定されたリソースによって、そのリソースに対応するプロジェクト内のパス、すなわち前述の文字列を見つける.
そのうち、asset.ResolveObjectは文字列に対応するリソースを検索し、UObejctを返します.Ublueprintタイプに変換してから、彼のGenerateClassに行けばいいです.
4つ目:StaticLoadObjectによるロード
UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/BluePrint/TestObj.TestObj'"));
if (loadObj != nullptr)
{
UBlueprint* ubp = Cast(loadObj);
AActor* spawnActor = GetWorld()->SpawnActor(ubp->GeneratedClass);
UE_LOG(LogClass, Log, TEXT("Success"));
}
原理はほとんど3つ目と同じです.呼び出しの仕方が違うだけだ.ここでは余計なことは言わない.
まとめると、第3種と第4種が最も通用するはずだ.第1の要求には対応する青写真C++クラスがあり、第2の要求には必ずコンストラクション関数で完了する(誰のコンストラクション関数でもよいが、この方法はコンストラクション関数でしか呼び出せない)...