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; \