diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index a986ded17..601ec34d4 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -763,7 +763,7 @@ ScriptingObject* Scripting::FindObject(Guid id, MClass* type) // Check if object can be an asset and try to load it if (!type) { - result = Content::LoadAsync(id, Asset::GetStaticClass()); + result = Content::LoadAsync(id); if (!result) LOG(Warning, "Unable to find scripting object with ID={0}", id); return result; @@ -781,6 +781,10 @@ ScriptingObject* Scripting::FindObject(Guid id, MClass* type) ScriptingObject* Scripting::TryFindObject(Guid id, MClass* type) { + if (!id.IsValid()) + return nullptr; + PROFILE_CPU(); + // Try to map object id const auto idsMapping = ObjectsLookupIdMapping.Get(); if (idsMapping) diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index 34e5735cb..ea7a3080c 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -7,6 +7,8 @@ #include "Engine/Level/Actor.h" #include "Engine/Core/Log.h" #include "Engine/Utilities/StringConverter.h" +#include "Engine/Content/Asset.h" +#include "Engine/Content/Content.h" #include "ManagedCLR/MAssembly.h" #include "ManagedCLR/MClass.h" #include "ManagedCLR/MUtils.h" @@ -556,10 +558,35 @@ public: static MonoObject* FindObject(Guid* id, MonoReflectionType* type) { - ScriptingObject* obj = Scripting::FindObject(*id); - if (obj && !obj->Is(MUtils::GetClass(type))) - obj = nullptr; - return obj ? obj->GetOrCreateManagedInstance() : nullptr; + if (!id->IsValid()) + return nullptr; +#if PLATFORM_LINUX + // Cannot enter GC unsafe region if the thread is not attached + MCore::AttachThread(); +#endif + auto klass = MUtils::GetClass(type); + ScriptingObject* obj = Scripting::TryFindObject(*id); + if (!obj) + { + if (!klass || klass == ScriptingObject::GetStaticClass()->GetNative() || mono_class_is_subclass_of(klass, Asset::GetStaticClass()->GetNative(), false) != 0) + { + obj = Content::LoadAsync(*id); + } + } + if (obj) + { + if (klass && !obj->Is(klass)) + { + LOG(Warning, "Found scripting object with ID={0} of type {1} that doesn't match type {2}.", *id, String(obj->GetType().Fullname), String(MUtils::GetClassFullname(klass))); + return nullptr; + } + return obj->GetOrCreateManagedInstance(); + } + if (klass) + LOG(Warning, "Unable to find scripting object with ID={0}. Required type {1}.", *id, String(MUtils::GetClassFullname(klass))); + else + LOG(Warning, "Unable to find scripting object with ID={0}", *id); + return nullptr; } static MonoObject* TryFindObject(Guid* id, MonoReflectionType* type)