Static variables in scripts are now reset when leaving play mode #351
|
@ -383,6 +383,13 @@ namespace SHADE
|
||||||
return eventData->handle;
|
return eventData->handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHEventHandle SHScriptEngine::onScenePlayStart(SHEventPtr eventPtr)
|
||||||
|
{
|
||||||
|
auto eventData = reinterpret_cast<const SHEventSpec<SHSceneGraphRemoveChildEvent>*>(eventPtr.get());
|
||||||
|
csResetStaticData();
|
||||||
|
return eventData->handle;
|
||||||
|
}
|
||||||
|
|
||||||
SHEventHandle SHScriptEngine::onSceneDestroyed(SHEventPtr eventPtr)
|
SHEventHandle SHScriptEngine::onSceneDestroyed(SHEventPtr eventPtr)
|
||||||
{
|
{
|
||||||
auto eventData = reinterpret_cast<const SHEventSpec<SHEditorStateChangeEvent>*>(eventPtr.get());
|
auto eventData = reinterpret_cast<const SHEventSpec<SHEditorStateChangeEvent>*>(eventPtr.get());
|
||||||
|
@ -556,6 +563,12 @@ namespace SHADE
|
||||||
DEFAULT_CSHARP_NAMESPACE + ".Editor",
|
DEFAULT_CSHARP_NAMESPACE + ".Editor",
|
||||||
"Redo"
|
"Redo"
|
||||||
);
|
);
|
||||||
|
csResetStaticData = dotNet.GetFunctionPtr<CsFuncPtr>
|
||||||
|
(
|
||||||
|
DEFAULT_CSHARP_LIB_NAME,
|
||||||
|
DEFAULT_CSHARP_NAMESPACE + ".EngineInterface",
|
||||||
|
"ResetStaticDataInLoadedAssembly"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHScriptEngine::registerEvents()
|
void SHScriptEngine::registerEvents()
|
||||||
|
@ -569,7 +582,12 @@ namespace SHADE
|
||||||
SHEventManager::SubscribeTo(SH_ENTITY_DESTROYED_EVENT, std::dynamic_pointer_cast<SHEventReceiver>(destroyedEventReceiver));
|
SHEventManager::SubscribeTo(SH_ENTITY_DESTROYED_EVENT, std::dynamic_pointer_cast<SHEventReceiver>(destroyedEventReceiver));
|
||||||
|
|
||||||
/* Editor */
|
/* Editor */
|
||||||
// Register for editor state change event
|
// Register for editor state change events
|
||||||
|
std::shared_ptr<SHEventReceiverSpec<SHScriptEngine>> startSceneEventReceiver
|
||||||
|
{
|
||||||
|
std::make_shared<SHEventReceiverSpec<SHScriptEngine>>(this, &SHScriptEngine::onScenePlayStart)
|
||||||
|
};
|
||||||
|
SHEventManager::SubscribeTo(SH_EDITOR_ON_PLAY_EVENT, std::dynamic_pointer_cast<SHEventReceiver>(startSceneEventReceiver));
|
||||||
std::shared_ptr<SHEventReceiverSpec<SHScriptEngine>> destroyedSceneEventReceiver
|
std::shared_ptr<SHEventReceiverSpec<SHScriptEngine>> destroyedSceneEventReceiver
|
||||||
{
|
{
|
||||||
std::make_shared<SHEventReceiverSpec<SHScriptEngine>>(this, &SHScriptEngine::onSceneDestroyed)
|
std::make_shared<SHEventReceiverSpec<SHScriptEngine>>(this, &SHScriptEngine::onSceneDestroyed)
|
||||||
|
|
|
@ -233,6 +233,10 @@ namespace SHADE
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
void OpenFile(const std::filesystem::path& path);
|
void OpenFile(const std::filesystem::path& path);
|
||||||
|
/// <summary>
|
||||||
|
/// Resets all static data in the loaded assemblies to their default values.
|
||||||
|
/// </summary>
|
||||||
|
static void ResetStaticDataInLoadedAssembly();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
@ -292,6 +296,8 @@ namespace SHADE
|
||||||
CsScriptEditorFuncPtr csEditorRenderScripts = nullptr;
|
CsScriptEditorFuncPtr csEditorRenderScripts = nullptr;
|
||||||
CsFuncPtr csEditorUndo = nullptr;
|
CsFuncPtr csEditorUndo = nullptr;
|
||||||
CsFuncPtr csEditorRedo = nullptr;
|
CsFuncPtr csEditorRedo = nullptr;
|
||||||
|
// - Other
|
||||||
|
CsFuncPtr csResetStaticData = nullptr;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Event Handler Functions */
|
/* Event Handler Functions */
|
||||||
|
@ -304,6 +310,7 @@ namespace SHADE
|
||||||
SHEventHandle onUIElementClicked(SHEventPtr eventPtr);
|
SHEventHandle onUIElementClicked(SHEventPtr eventPtr);
|
||||||
SHEventHandle onSceneNodeChildrenAdded(SHEventPtr eventPtr);
|
SHEventHandle onSceneNodeChildrenAdded(SHEventPtr eventPtr);
|
||||||
SHEventHandle onSceneNodeChildrenRemoved(SHEventPtr eventPtr);
|
SHEventHandle onSceneNodeChildrenRemoved(SHEventPtr eventPtr);
|
||||||
|
SHEventHandle onScenePlayStart(SHEventPtr eventPtr);
|
||||||
SHEventHandle onSceneDestroyed(SHEventPtr eventPtr);
|
SHEventHandle onSceneDestroyed(SHEventPtr eventPtr);
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -78,6 +78,21 @@ namespace SHADE
|
||||||
LoadScriptAssembly();
|
LoadScriptAssembly();
|
||||||
SAFE_NATIVE_CALL_END_N("SHADE_Managed.EngineInterface")
|
SAFE_NATIVE_CALL_END_N("SHADE_Managed.EngineInterface")
|
||||||
}
|
}
|
||||||
|
void EngineInterface::ResetStaticDataInLoadedAssembly()
|
||||||
|
{
|
||||||
|
SAFE_NATIVE_CALL_BEGIN
|
||||||
|
System::Reflection::Assembly^ assembly = System::Linq::Enumerable::FirstOrDefault(scriptContext->Assemblies);
|
||||||
|
for each (System::Type ^ type in assembly->ExportedTypes)
|
||||||
|
{
|
||||||
|
if (type->TypeInitializer)
|
||||||
|
{
|
||||||
|
type->TypeInitializer->Invoke(nullptr, nullptr);
|
||||||
|
Debug::LogWarning("Called Static Constructor for: " + type->Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SAFE_NATIVE_CALL_END_N("SHADE_Managed.EngineInterface")
|
||||||
|
}
|
||||||
void EngineInterface::Exit()
|
void EngineInterface::Exit()
|
||||||
{
|
{
|
||||||
SAFE_NATIVE_CALL_BEGIN
|
SAFE_NATIVE_CALL_BEGIN
|
||||||
|
|
|
@ -59,6 +59,10 @@ namespace SHADE
|
||||||
/// </summary>
|
/// </summary>
|
||||||
static void ReloadScriptAssembly();
|
static void ReloadScriptAssembly();
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// Resets all static data in the loaded assemblies to their default values.
|
||||||
|
/// </summary>
|
||||||
|
static void ResetStaticDataInLoadedAssembly();
|
||||||
|
/// <summary>
|
||||||
/// Cleans up all required components for managed code.
|
/// Cleans up all required components for managed code.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
static void Exit();
|
static void Exit();
|
||||||
|
|
Loading…
Reference in New Issue