From b64c0780a0b2dda80c2746bb9e6a0f22185048d9 Mon Sep 17 00:00:00 2001 From: 3mr-TheBadNomads Date: Wed, 8 Feb 2023 01:46:57 +0200 Subject: [PATCH 1/2] Added Utilities --- Assets/Scripts/Utilities.meta | 8 +++ .../Utilities/MonoBehaviourExtensions.cs | 70 +++++++++++++++++++ .../Utilities/MonoBehaviourExtensions.cs.meta | 11 +++ .../Utilities/MonoBehaviourExtensionsDemo.cs | 34 +++++++++ .../MonoBehaviourExtensionsDemo.cs.meta | 11 +++ 5 files changed, 134 insertions(+) create mode 100644 Assets/Scripts/Utilities.meta create mode 100644 Assets/Scripts/Utilities/MonoBehaviourExtensions.cs create mode 100644 Assets/Scripts/Utilities/MonoBehaviourExtensions.cs.meta create mode 100644 Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs create mode 100644 Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs.meta diff --git a/Assets/Scripts/Utilities.meta b/Assets/Scripts/Utilities.meta new file mode 100644 index 0000000..8d393d8 --- /dev/null +++ b/Assets/Scripts/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b747b5f210cbbc6468a91778523829fa +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs b/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs new file mode 100644 index 0000000..63d95af --- /dev/null +++ b/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs @@ -0,0 +1,70 @@ +using System; +using System.Collections; +using System.Linq; +using System.Reflection; +using UnityEngine; + +public static class MonoBehaviourExtensions +{ + #region Public API + + public static Coroutine Wait(this MonoBehaviour monoBehaviour, float seconds) + { + return monoBehaviour.StartCoroutine(Wait(seconds)); + } + + public static Coroutine InvokeDelayed(this MonoBehaviour monoBehaviour, float delayInSeconds, string methodName, params object[] parameters) + { + return monoBehaviour.StartCoroutine(InnerInvokeDelayed(monoBehaviour, delayInSeconds, methodName, parameters)); + } + + public static Coroutine InvokeRepeated(this MonoBehaviour monoBehaviour, float delayInSeconds, float repeatRateInSeconds, string methodName, params object[] parameters) + { + return monoBehaviour.StartCoroutine(InnerInvokeRepeated(monoBehaviour, delayInSeconds, repeatRateInSeconds, methodName, parameters)); + } + + #endregion + + #region Private methods + + private static IEnumerator InnerInvokeDelayed(MonoBehaviour monoBehaviour, float delayInSeconds, string methodName, params object[] parameters) + { + yield return new WaitForSeconds(delayInSeconds); + + MethodInfo methodInfo = GetMethodFromMonoBehaviour(monoBehaviour, methodName, parameters); + + methodInfo.Invoke(monoBehaviour, parameters); + } + + private static IEnumerator Wait(float seconds) + { + yield return new WaitForSeconds(seconds); + } + + private static IEnumerator InnerInvokeRepeated(MonoBehaviour monoBehaviour, float delayInSeconds, float repeatRateInSeconds, string methodName, params object[] parameters) + { + yield return new WaitForSeconds(delayInSeconds); + + MethodInfo methodInfo = GetMethodFromMonoBehaviour(monoBehaviour, methodName, parameters); + + methodInfo.Invoke(monoBehaviour, parameters); + + while (true) + { + yield return new WaitForSeconds(repeatRateInSeconds); + + methodInfo.Invoke(monoBehaviour, parameters); + } + } + + private static MethodInfo GetMethodFromMonoBehaviour(MonoBehaviour monoBehaviour, string methodName, params object[] parameters) + { + + Type[] parameterTypes = parameters.Select(parameter => parameter.GetType()).ToArray(); + + return monoBehaviour.GetType().GetMethod(methodName, parameterTypes); + } + + #endregion + +} diff --git a/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs.meta b/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs.meta new file mode 100644 index 0000000..4eed440 --- /dev/null +++ b/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b2bb5e3d92589647b8c1d80f0ad7964 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs b/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs new file mode 100644 index 0000000..bdad635 --- /dev/null +++ b/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs @@ -0,0 +1,34 @@ +using UnityEngine; + +public class MonoBehaviourExtensionsDemo : MonoBehaviour +{ + public int i = 0; + + void Start() + { + this.Wait(1); + Debug.Log("done waiting"); + this.InvokeDelayed(1, nameof(HelloWorld)); + this.Wait(1); + this.InvokeDelayed(1, nameof(HelloWorld), 4); + this.Wait(1); + this.InvokeRepeated(2, 2, nameof(CountedHelloWorld)); + } + + public void HelloWorld() + { + Debug.Log("hello world!"); + } + + public void HelloWorld(int num) + { + Debug.Log("hello world #" + num); + } + + public void CountedHelloWorld() + { + HelloWorld(i); + i++; + } + +} diff --git a/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs.meta b/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs.meta new file mode 100644 index 0000000..dac2603 --- /dev/null +++ b/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9571d698da2650b48a35c2844b3773d0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 272784c8513b0a04e1e1e469e299e1d087a79a13 Mon Sep 17 00:00:00 2001 From: amr-abdalla Date: Thu, 9 Feb 2023 22:46:08 +0200 Subject: [PATCH 2/2] Stopped Using Reflections because bad performance --- .../Utilities/MonoBehaviourExtensions.cs | 42 ++++++------------- .../Utilities/MonoBehaviourExtensionsDemo.cs | 30 +++++++++---- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs b/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs index 63d95af..a100de6 100644 --- a/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs +++ b/Assets/Scripts/Utilities/MonoBehaviourExtensions.cs @@ -1,8 +1,6 @@ -using System; using System.Collections; -using System.Linq; -using System.Reflection; using UnityEngine; +using UnityEngine.Events; public static class MonoBehaviourExtensions { @@ -13,58 +11,44 @@ public static Coroutine Wait(this MonoBehaviour monoBehaviour, float seconds) return monoBehaviour.StartCoroutine(Wait(seconds)); } - public static Coroutine InvokeDelayed(this MonoBehaviour monoBehaviour, float delayInSeconds, string methodName, params object[] parameters) + public static Coroutine InvokeDelayed(this MonoBehaviour monoBehaviour, UnityAction action, float delayInSeconds) { - return monoBehaviour.StartCoroutine(InnerInvokeDelayed(monoBehaviour, delayInSeconds, methodName, parameters)); + return monoBehaviour.StartCoroutine(InnerInvokeDelayed(action, delayInSeconds)); } - public static Coroutine InvokeRepeated(this MonoBehaviour monoBehaviour, float delayInSeconds, float repeatRateInSeconds, string methodName, params object[] parameters) + public static Coroutine InvokeRepeated(this MonoBehaviour monoBehaviour, UnityAction action, float delayInSeconds, float repeatRateInSeconds) { - return monoBehaviour.StartCoroutine(InnerInvokeRepeated(monoBehaviour, delayInSeconds, repeatRateInSeconds, methodName, parameters)); + return monoBehaviour.StartCoroutine(InnerInvokeRepeated(action, delayInSeconds, repeatRateInSeconds)); } #endregion #region Private methods - - private static IEnumerator InnerInvokeDelayed(MonoBehaviour monoBehaviour, float delayInSeconds, string methodName, params object[] parameters) - { - yield return new WaitForSeconds(delayInSeconds); - - MethodInfo methodInfo = GetMethodFromMonoBehaviour(monoBehaviour, methodName, parameters); - - methodInfo.Invoke(monoBehaviour, parameters); - } - private static IEnumerator Wait(float seconds) { yield return new WaitForSeconds(seconds); } - private static IEnumerator InnerInvokeRepeated(MonoBehaviour monoBehaviour, float delayInSeconds, float repeatRateInSeconds, string methodName, params object[] parameters) + private static IEnumerator InnerInvokeDelayed(UnityAction action, float delayInSeconds) { yield return new WaitForSeconds(delayInSeconds); + action.Invoke(); + } - MethodInfo methodInfo = GetMethodFromMonoBehaviour(monoBehaviour, methodName, parameters); + private static IEnumerator InnerInvokeRepeated(UnityAction action, float delayInSeconds, float repeatRateInSeconds) + { + yield return new WaitForSeconds(delayInSeconds); - methodInfo.Invoke(monoBehaviour, parameters); + action.Invoke(); while (true) { yield return new WaitForSeconds(repeatRateInSeconds); - methodInfo.Invoke(monoBehaviour, parameters); + action.Invoke(); } } - private static MethodInfo GetMethodFromMonoBehaviour(MonoBehaviour monoBehaviour, string methodName, params object[] parameters) - { - - Type[] parameterTypes = parameters.Select(parameter => parameter.GetType()).ToArray(); - - return monoBehaviour.GetType().GetMethod(methodName, parameterTypes); - } - #endregion } diff --git a/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs b/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs index bdad635..50bd990 100644 --- a/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs +++ b/Assets/Scripts/Utilities/MonoBehaviourExtensionsDemo.cs @@ -1,18 +1,32 @@ +using System.Collections; using UnityEngine; +using UnityEngine.Events; public class MonoBehaviourExtensionsDemo : MonoBehaviour { public int i = 0; - void Start() + private IEnumerator Start() { - this.Wait(1); + yield return (this.Wait(1)); Debug.Log("done waiting"); - this.InvokeDelayed(1, nameof(HelloWorld)); - this.Wait(1); - this.InvokeDelayed(1, nameof(HelloWorld), 4); - this.Wait(1); - this.InvokeRepeated(2, 2, nameof(CountedHelloWorld)); + + UnityAction helloWorld1 = () => HelloWorld(); + yield return(this.InvokeDelayed(helloWorld1, 2)); //this will halt everything below until it finishes invoking + + UnityAction helloWorld2 = () => HelloWorld(2); + yield return(this.InvokeDelayed(helloWorld2, 2)); //this will halt everything below until it finishes invoking + + UnityAction helloWorld3= () => HelloWorld(200); + this.InvokeDelayed(helloWorld3, 2); //this will NOT halt everything below until it finishes invoking, it just invokes it with a delay + + UnityAction countedHelloWorld = () => CountedHelloWorld(); + var repeatedRoutine = this.InvokeRepeated(countedHelloWorld, 0, 0.5f); + + yield return (this.Wait(3)); + Debug.Log("stopping now"); + StopCoroutine(repeatedRoutine); + } public void HelloWorld() @@ -22,7 +36,7 @@ public void HelloWorld() public void HelloWorld(int num) { - Debug.Log("hello world #" + num); + Debug.Log("hello world # " + num); } public void CountedHelloWorld()