66#include " DataConfig/Property/DcPropertyWriter.h"
77#include " DataConfig/SerDe/DcSerDeUtils.inl"
88
9+ #include " Misc/EngineVersionComparison.h"
10+
911namespace DcSerDeUtils {
1012
1113bool IsMeta (const FString& Str)
@@ -28,6 +30,61 @@ FDcResult DispatchPipeVisit(EDcDataEntry Next, FDcReader* Reader, FDcWriter* Wri
2830 return DcPipe_Dispatch (Next, Reader, Writer);
2931}
3032
33+
34+ UObject* StaticFindFirstObject (UClass* Class, const TCHAR* Name, bool bExactClass)
35+ {
36+ #if UE_VERSION_OLDER_THAN(5, 1, 0)
37+ UObject* Ret = StaticFindObject (Class, ANY_PACKAGE, Name, bExactClass);
38+ #else
39+ UObject* Ret = StaticFindFirstObject (Class, Name,
40+ EFindFirstObjectOptions::NativeFirst |
41+ (bExactClass ? EFindFirstObjectOptions::ExactClass : EFindFirstObjectOptions::None)
42+ );
43+ #endif
44+ return Ret;
45+ }
46+
47+ FDcResult TryStaticFindFirstObject (UClass* Class, const TCHAR* Name, bool bExactClass, UObject*& OutObject)
48+ {
49+ UObject* Ret = DcSerDeUtils::StaticFindFirstObject (Class, Name, bExactClass);
50+ if (!Ret)
51+ {
52+ return DC_FAIL (DcDSerDe, UObjectByStrNotFound) << Class->GetFName () << Name;
53+ }
54+ else
55+ {
56+ OutObject = Ret;
57+ return DcOk ();
58+ }
59+ }
60+
61+ FDcResult TryStaticFindObject (UClass* Class, const FName& PackageName, const FName& AssetName, bool ExactClass, UObject*& OutObject)
62+ {
63+ #if UE_VERSION_OLDER_THAN(5, 1, 0)
64+ UObject* Ret = nullptr ;
65+ if (!AssetName.IsNone ())
66+ {
67+ UObject* Package = StaticFindObjectFast (UPackage::StaticClass (), nullptr , PackageName);
68+ if (Package)
69+ {
70+ Ret = StaticFindObjectFast (Class, Package, AssetName, ExactClass);
71+ }
72+ }
73+ #else
74+ UObject* Ret = StaticFindObject (Class, FTopLevelAssetPath{PackageName, AssetName}, ExactClass);
75+ #endif
76+
77+ if (!Ret)
78+ {
79+ return DC_FAIL (DcDSerDe, UObjectByStrNotFound) << Class->GetFName () << AssetName;
80+ }
81+ else
82+ {
83+ OutObject = Ret;
84+ return DcOk ();
85+ }
86+ }
87+
3188FDcResult TryStaticFindObject (UClass* Class, UObject* Outer, const TCHAR* Name, bool ExactClass, UObject*& OutObject)
3289{
3390 check (Class);
@@ -58,14 +115,14 @@ FDcResult TryStaticLoadObject(UClass* Class, UObject* Outer, const TCHAR* LoadPa
58115 }
59116}
60117
61- FDcResult TryStaticLocateObject (UClass* Class, const FString& Str, UObject*& OutObject)
118+ FDcResult TryStaticLocateObject (UClass* Class, FStringView Str, UObject*& OutObject)
62119{
63120 if (Str.StartsWith (TEXT (" /" )))
64121 {
65122 // /Game/Path/To/Object
66123 // `Game` is a Mount Point, and there's no `.uasset` suffix
67124 UObject* Loaded;
68- DC_TRY (DcSerDeUtils::TryStaticLoadObject (Class, nullptr , * Str, Loaded));
125+ DC_TRY (DcSerDeUtils::TryStaticLoadObject (Class, nullptr , Str. GetData () , Loaded));
69126
70127 OutObject = Loaded;
71128 return DcOk ();
@@ -76,10 +133,10 @@ FDcResult TryStaticLocateObject(UClass* Class, const FString& Str, UObject*& Out
76133 {
77134 // '/Foo/Bar'
78135 // single quoted name, it's object name starting with '/'
79- FString Unquoted = Str. Mid ( 1 , Str. Len () - 2 );
136+ // note that need to use the quoted name to find
80137
81138 UObject* Loaded;
82- DC_TRY (DcSerDeUtils::TryStaticFindObject (Class, ANY_PACKAGE, * Str, false , Loaded));
139+ DC_TRY (DcSerDeUtils::TryStaticFindFirstObject (Class, Str. GetData () , false , Loaded));
83140
84141 OutObject = Loaded;
85142 return DcOk ();
@@ -89,7 +146,7 @@ FDcResult TryStaticLocateObject(UClass* Class, const FString& Str, UObject*& Out
89146 // Foo
90147 // try find by name
91148 UObject* Loaded;
92- DC_TRY (DcSerDeUtils::TryStaticFindObject (Class, ANY_PACKAGE, * Str, false , Loaded));
149+ DC_TRY (DcSerDeUtils::TryStaticFindFirstObject (Class, Str. GetData () , false , Loaded));
93150
94151 OutObject = Loaded;
95152 return DcOk ();
0 commit comments