From 39fbfbd6fa4348028543e1292267e3a6c51aef0c Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Wed, 1 Feb 2023 00:34:09 +0800 Subject: [PATCH] Added more reliable method of reloading static C# data --- Assets/Scripts/StaticTest.cs | 37 +++++++++++++++++++ Assets/Scripts/StaticTest.cs.shmeta | 3 ++ SHADE_Engine/src/Scripting/SHScriptEngine.cpp | 19 +--------- SHADE_Engine/src/Scripting/SHScriptEngine.h | 3 -- SHADE_Managed/src/Engine/EngineInterface.cxx | 15 -------- SHADE_Managed/src/Engine/EngineInterface.hxx | 4 -- 6 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 Assets/Scripts/StaticTest.cs create mode 100644 Assets/Scripts/StaticTest.cs.shmeta diff --git a/Assets/Scripts/StaticTest.cs b/Assets/Scripts/StaticTest.cs new file mode 100644 index 00000000..a382a96e --- /dev/null +++ b/Assets/Scripts/StaticTest.cs @@ -0,0 +1,37 @@ +using SHADE; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SHADE_Scripting +{ + public class StaticTest + { + public static int x; + + static StaticTest() + { + x = 5; + Debug.Log("Static Constructor!"); + } + } + + public class ImplicitStaticTest : Script + { + public static int x = 5; + + static ImplicitStaticTest() + { + Debug.Log("Static Constructor!"); + } + + protected override void awake() + { + Debug.LogWarning($"Before Add: x = {x}"); + ++x; + Debug.LogWarning($"After Add: x = {x}"); + } + } +} diff --git a/Assets/Scripts/StaticTest.cs.shmeta b/Assets/Scripts/StaticTest.cs.shmeta new file mode 100644 index 00000000..2da681fa --- /dev/null +++ b/Assets/Scripts/StaticTest.cs.shmeta @@ -0,0 +1,3 @@ +Name: StaticTest +ID: 159057282 +Type: 9 diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp index 67ab45fe..49a79cde 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp @@ -383,17 +383,11 @@ namespace SHADE return eventData->handle; } - SHEventHandle SHScriptEngine::onScenePlayStart(SHEventPtr eventPtr) - { - auto eventData = reinterpret_cast*>(eventPtr.get()); - csResetStaticData(); - return eventData->handle; - } - SHEventHandle SHScriptEngine::onSceneDestroyed(SHEventPtr eventPtr) { auto eventData = reinterpret_cast*>(eventPtr.get()); csScriptRemoveAllForAllNow(true); + csEngineReloadScripts(); return eventData->handle; } @@ -563,12 +557,6 @@ namespace SHADE DEFAULT_CSHARP_NAMESPACE + ".Editor", "Redo" ); - csResetStaticData = dotNet.GetFunctionPtr - ( - DEFAULT_CSHARP_LIB_NAME, - DEFAULT_CSHARP_NAMESPACE + ".EngineInterface", - "ResetStaticDataInLoadedAssembly" - ); } void SHScriptEngine::registerEvents() @@ -583,11 +571,6 @@ namespace SHADE /* Editor */ // Register for editor state change events - std::shared_ptr> startSceneEventReceiver - { - std::make_shared>(this, &SHScriptEngine::onScenePlayStart) - }; - SHEventManager::SubscribeTo(SH_EDITOR_ON_PLAY_EVENT, std::dynamic_pointer_cast(startSceneEventReceiver)); std::shared_ptr> destroyedSceneEventReceiver { std::make_shared>(this, &SHScriptEngine::onSceneDestroyed) diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.h b/SHADE_Engine/src/Scripting/SHScriptEngine.h index 1470fda7..9b234d04 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.h +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.h @@ -296,8 +296,6 @@ namespace SHADE CsScriptEditorFuncPtr csEditorRenderScripts = nullptr; CsFuncPtr csEditorUndo = nullptr; CsFuncPtr csEditorRedo = nullptr; - // - Other - CsFuncPtr csResetStaticData = nullptr; /*-----------------------------------------------------------------------------*/ /* Event Handler Functions */ @@ -310,7 +308,6 @@ namespace SHADE SHEventHandle onUIElementClicked(SHEventPtr eventPtr); SHEventHandle onSceneNodeChildrenAdded(SHEventPtr eventPtr); SHEventHandle onSceneNodeChildrenRemoved(SHEventPtr eventPtr); - SHEventHandle onScenePlayStart(SHEventPtr eventPtr); SHEventHandle onSceneDestroyed(SHEventPtr eventPtr); /*-----------------------------------------------------------------------------*/ diff --git a/SHADE_Managed/src/Engine/EngineInterface.cxx b/SHADE_Managed/src/Engine/EngineInterface.cxx index 98039d2d..2009b2e5 100644 --- a/SHADE_Managed/src/Engine/EngineInterface.cxx +++ b/SHADE_Managed/src/Engine/EngineInterface.cxx @@ -78,21 +78,6 @@ namespace SHADE LoadScriptAssembly(); 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() { SAFE_NATIVE_CALL_BEGIN diff --git a/SHADE_Managed/src/Engine/EngineInterface.hxx b/SHADE_Managed/src/Engine/EngineInterface.hxx index 3477a670..37ded4eb 100644 --- a/SHADE_Managed/src/Engine/EngineInterface.hxx +++ b/SHADE_Managed/src/Engine/EngineInterface.hxx @@ -59,10 +59,6 @@ namespace SHADE /// static void ReloadScriptAssembly(); /// - /// Resets all static data in the loaded assemblies to their default values. - /// - static void ResetStaticDataInLoadedAssembly(); - /// /// Cleans up all required components for managed code. /// static void Exit();