/* ------------------- Code Monkey ------------------- Thank you for downloading the Code Monkey Utilities I hope you find them useful in your projects If you have any questions use the contact form Cheers! unitycodemonkey.com -------------------------------------------------- */ using System; using UnityEngine; using System.Collections.Generic; namespace CodeMonkey.Utils { /* * Calls function on every Update until it returns true * */ public class FunctionUpdater { /* * Class to hook Actions into MonoBehaviour * */ private class MonoBehaviourHook : MonoBehaviour { public Action OnUpdate; private void Update() { if (OnUpdate != null) OnUpdate(); } } private static List updaterList; // Holds a reference to all active updaters private static GameObject initGameObject; // Global game object used for initializing class, is destroyed on scene change private static void InitIfNeeded() { if (initGameObject == null) { initGameObject = new GameObject("FunctionUpdater_Global"); updaterList = new List(); } } public static FunctionUpdater Create(Action updateFunc) { return Create(() => { updateFunc(); return false; }, "", true, false); } public static FunctionUpdater Create(Action updateFunc, string functionName) { return Create(() => { updateFunc(); return false; }, functionName, true, false); } public static FunctionUpdater Create(Func updateFunc) { return Create(updateFunc, "", true, false); } public static FunctionUpdater Create(Func updateFunc, string functionName) { return Create(updateFunc, functionName, true, false); } public static FunctionUpdater Create(Func updateFunc, string functionName, bool active) { return Create(updateFunc, functionName, active, false); } public static FunctionUpdater Create(Func updateFunc, string functionName, bool active, bool stopAllWithSameName) { InitIfNeeded(); if (stopAllWithSameName) { StopAllUpdatersWithName(functionName); } GameObject gameObject = new GameObject("FunctionUpdater Object " + functionName, typeof(MonoBehaviourHook)); FunctionUpdater functionUpdater = new FunctionUpdater(gameObject, updateFunc, functionName, active); gameObject.GetComponent().OnUpdate = functionUpdater.Update; updaterList.Add(functionUpdater); return functionUpdater; } private static void RemoveUpdater(FunctionUpdater funcUpdater) { InitIfNeeded(); updaterList.Remove(funcUpdater); } public static void DestroyUpdater(FunctionUpdater funcUpdater) { InitIfNeeded(); if (funcUpdater != null) { funcUpdater.DestroySelf(); } } public static void StopUpdaterWithName(string functionName) { InitIfNeeded(); for (int i = 0; i < updaterList.Count; i++) { if (updaterList[i].functionName == functionName) { updaterList[i].DestroySelf(); return; } } } public static void StopAllUpdatersWithName(string functionName) { InitIfNeeded(); for (int i = 0; i < updaterList.Count; i++) { if (updaterList[i].functionName == functionName) { updaterList[i].DestroySelf(); i--; } } } private GameObject gameObject; private string functionName; private bool active; private Func updateFunc; // Destroy Updater if return true; public FunctionUpdater(GameObject gameObject, Func updateFunc, string functionName, bool active) { this.gameObject = gameObject; this.updateFunc = updateFunc; this.functionName = functionName; this.active = active; } public void Pause() { active = false; } public void Resume() { active = true; } private void Update() { if (!active) return; if (updateFunc()) { DestroySelf(); } } public void DestroySelf() { RemoveUpdater(this); if (gameObject != null) { UnityEngine.Object.Destroy(gameObject); } } } }