diff --git a/Source/Engine/Content/JsonAsset.cpp b/Source/Engine/Content/JsonAsset.cpp index 6808c4ca2..4725f1ce9 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -284,6 +284,8 @@ void JsonAsset::unload(bool isReloading) bool JsonAsset::CreateInstance() { ScopeLock lock(Locker); + if (Instance) + return false; // Try to scripting type for this data const StringAsANSI<> dataTypeNameAnsi(DataTypeName.Get(), DataTypeName.Length()); diff --git a/Source/Engine/Content/JsonAsset.h b/Source/Engine/Content/JsonAsset.h index 6d7b88526..5f2862abc 100644 --- a/Source/Engine/Content/JsonAsset.h +++ b/Source/Engine/Content/JsonAsset.h @@ -107,7 +107,7 @@ public: ScriptingTypeHandle InstanceType; /// - /// The deserialized unmanaged object instance (e.g. PhysicalMaterial). + /// The deserialized unmanaged object instance (e.g. PhysicalMaterial). Might be null if asset was loaded before binary module with that asset was loaded (use GetInstance for this case). /// void* Instance; @@ -118,6 +118,7 @@ public: template T* GetInstance() const { + const_cast(this)->CreateInstance(); return Instance && InstanceType.IsAssignableFrom(T::TypeInitializer) ? (T*)Instance : nullptr; } diff --git a/Source/Engine/Core/Config/Settings.h b/Source/Engine/Core/Config/Settings.h index 31af8d25a..a9fef85f5 100644 --- a/Source/Engine/Core/Config/Settings.h +++ b/Source/Engine/Core/Config/Settings.h @@ -62,9 +62,10 @@ public: Guid assetId = Guid::Empty; \ gameSettings->CustomSettings.TryGet(TEXT(name), assetId); \ const auto asset = Content::Load(assetId); \ - if (asset && asset->Instance && asset->InstanceType == type::TypeInitializer) \ + if (asset) \ { \ - result = static_cast(asset->Instance); \ + if (auto* instance = asset->GetInstance()) \ + result = instance; \ } \ } \ return result; \