/*
------------------- 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<FunctionUpdater> 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<FunctionUpdater>();
}
}
public static FunctionUpdater Create(Action updateFunc) {
return Create(() => { updateFunc(); return false; }, "", true, false);
}
public static FunctionUpdater Create(Func<bool> updateFunc) {
return Create(updateFunc, "", true, false);
}
public static FunctionUpdater Create(Func<bool> updateFunc, string functionName) {
return Create(updateFunc, functionName, true, false);
}
public static FunctionUpdater Create(Func<bool> updateFunc, string functionName, bool active) {
return Create(updateFunc, functionName, active, false);
}
public static FunctionUpdater Create(Func<bool> 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<MonoBehaviourHook>().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<bool> updateFunc; // Destroy Updater if return true;
public FunctionUpdater(GameObject gameObject, Func<bool> 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);
}
}
}
}