From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/Scripting/DelayedCallUtility.cpp | 73 ++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Runtime/Scripting/DelayedCallUtility.cpp (limited to 'Runtime/Scripting/DelayedCallUtility.cpp') diff --git a/Runtime/Scripting/DelayedCallUtility.cpp b/Runtime/Scripting/DelayedCallUtility.cpp new file mode 100644 index 0000000..5e7d9f0 --- /dev/null +++ b/Runtime/Scripting/DelayedCallUtility.cpp @@ -0,0 +1,73 @@ +#include "UnityPrefix.h" + +#if ENABLE_SCRIPTING + +#include "Runtime/Scripting/DelayedCallUtility.h" +#include "Runtime/Scripting/ScriptingUtility.h" +#include "Runtime/GameCode/CallDelayed.h" +#include "Runtime/Mono/MonoBehaviour.h" +#include "Runtime/Mono/MonoScript.h" + +static void ForwardInvokeDelayed (Object* o, void* userData) +{ + const char* methodName = (const char*)userData; + MonoBehaviour* behaviour = static_cast (o); + if (behaviour->GetInstance ()) + { + bool didCall = behaviour->CallMethodInactive (methodName); + #if !DEPLOY_OPTIMIZED + if (!didCall) + LogStringObject ("Trying to Invoke method: " + behaviour->GetScript ()->GetScriptClassName () + "." + methodName + " couldn't be called.", o); + #else + UNUSED(didCall); + #endif + + } +} + +static void ForwardInvokeDelayedCleanup (void* userData) +{ + ScriptingStringToAllocatedChars_Free ((char*)userData); +} + +void InvokeDelayed (MonoBehaviour& behaviour, ICallString& monoMethodName, float time, float repeatRate) +{ + char* methodName = ScriptingStringToAllocatedChars (monoMethodName); + if (repeatRate > 0.00001F || repeatRate == 0.0F) + CallDelayed (&ForwardInvokeDelayed, &behaviour, time, methodName, repeatRate, &ForwardInvokeDelayedCleanup); + else + Scripting::RaiseMonoException ("Invoke repeat rate has to be larger than 0.00001F)"); +} + + +static bool ShouldCancelInvoke (void* lhs, void* rhs) +{ + return strcmp ((char*)lhs, (char*)rhs) == 0; +} + +void CancelInvoke (MonoBehaviour& behaviour, ICallString& monoMethodName) +{ + char* methodName = ScriptingStringToAllocatedChars (monoMethodName); + GetDelayedCallManager ().CancelCallDelayed (&behaviour, &ForwardInvokeDelayed, &ShouldCancelInvoke, methodName); + ScriptingStringToAllocatedChars_Free (methodName); +} + +void CancelInvoke (MonoBehaviour& behaviour) +{ + GetDelayedCallManager ().CancelCallDelayed (&behaviour, &ForwardInvokeDelayed, NULL, NULL); +} + +bool IsInvoking (MonoBehaviour& behaviour) +{ + return GetDelayedCallManager ().HasDelayedCall (&behaviour, &ForwardInvokeDelayed, NULL, NULL); +} + +bool IsInvoking (MonoBehaviour& behaviour, ICallString& monoMethodName) +{ + char* methodName = ScriptingStringToAllocatedChars (monoMethodName); + bool result = GetDelayedCallManager ().HasDelayedCall (&behaviour, &ForwardInvokeDelayed, &ShouldCancelInvoke, methodName); + ScriptingStringToAllocatedChars_Free (methodName); + return result; +} + +#endif -- cgit v1.1-26-g67d0