Fix crash on shutdown due to custom JsonAsset C++ instance

This commit is contained in:
Wojciech Figat
2022-09-13 12:55:14 +02:00
parent a006fcec40
commit de1437102e

View File

@@ -263,6 +263,9 @@ Asset::LoadResult JsonAsset::loadAsset()
Level::ScriptsReloaded.Bind<JsonAsset, &JsonAsset::OnScriptsReloaded>(this); Level::ScriptsReloaded.Bind<JsonAsset, &JsonAsset::OnScriptsReloaded>(this);
#endif #endif
// Destroy instance on scripting shutdown (eg. asset from scripts)
Scripting::ScriptsUnload.Bind<JsonAsset, &JsonAsset::DeleteInstance>(this);
return LoadResult::Ok; return LoadResult::Ok;
} }
@@ -272,6 +275,7 @@ void JsonAsset::unload(bool isReloading)
Level::ScriptsReloadStart.Unbind<JsonAsset, &JsonAsset::OnScriptsReloadStart>(this); Level::ScriptsReloadStart.Unbind<JsonAsset, &JsonAsset::OnScriptsReloadStart>(this);
Level::ScriptsReloaded.Unbind<JsonAsset, &JsonAsset::OnScriptsReloaded>(this); Level::ScriptsReloaded.Unbind<JsonAsset, &JsonAsset::OnScriptsReloaded>(this);
#endif #endif
Scripting::ScriptsUnload.Unbind<JsonAsset, &JsonAsset::DeleteInstance>(this);
DeleteInstance(); DeleteInstance();
JsonAssetBase::unload(isReloading); JsonAssetBase::unload(isReloading);
@@ -279,6 +283,8 @@ void JsonAsset::unload(bool isReloading)
bool JsonAsset::CreateInstance() bool JsonAsset::CreateInstance()
{ {
ScopeLock lock(Locker);
// Try to scripting type for this data // Try to scripting type for this data
const StringAsANSI<> dataTypeNameAnsi(DataTypeName.Get(), DataTypeName.Length()); const StringAsANSI<> dataTypeNameAnsi(DataTypeName.Get(), DataTypeName.Length());
const auto typeHandle = Scripting::FindScriptingType(StringAnsiView(dataTypeNameAnsi.Get(), DataTypeName.Length())); const auto typeHandle = Scripting::FindScriptingType(StringAnsiView(dataTypeNameAnsi.Get(), DataTypeName.Length()));
@@ -320,6 +326,8 @@ bool JsonAsset::CreateInstance()
void JsonAsset::DeleteInstance() void JsonAsset::DeleteInstance()
{ {
ScopeLock lock(Locker);
// C# instance // C# instance
if (MObject* object = GetManagedInstance()) if (MObject* object = GetManagedInstance())
{ {