diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index ddfb0fca5..b8775f941 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -82,6 +82,17 @@ MClass* ScriptingObject::GetClass() const return _type ? _type.GetType().ManagedClass : nullptr; } +ScriptingObject* ScriptingObject::NewObject(const ScriptingTypeHandle& typeHandle) +{ + if (!typeHandle) + return nullptr; + auto& type = typeHandle.GetType(); + if (type.Type != ScriptingTypes::Script) + return nullptr; + const ScriptingObjectSpawnParams params(Guid::New(), typeHandle); + return type.Script.Spawn(params); +} + ScriptingObject* ScriptingObject::FromInterface(void* interfaceObj, const ScriptingTypeHandle& interfaceType) { if (!interfaceObj || !interfaceType) diff --git a/Source/Engine/Scripting/ScriptingObject.h b/Source/Engine/Scripting/ScriptingObject.h index b29078d45..a0114b1a4 100644 --- a/Source/Engine/Scripting/ScriptingObject.h +++ b/Source/Engine/Scripting/ScriptingObject.h @@ -108,6 +108,13 @@ public: public: + static ScriptingObject* NewObject(const ScriptingTypeHandle& typeHandle); + template + static T* NewObject() + { + return (T*)NewObject(T::TypeInitializer); + } + // Tries to cast native interface object to scripting object instance. Returns null if fails. static ScriptingObject* FromInterface(void* interfaceObj, const ScriptingTypeHandle& interfaceType); static void* ToInterface(ScriptingObject* obj, const ScriptingTypeHandle& interfaceType);