/*
------------------- 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 {
/*
* Triggers a Action after a certain time
* */
public class FunctionTimer {
/*
* Class to hook Actions into MonoBehaviour
* */
private class MonoBehaviourHook : MonoBehaviour {
public Action OnUpdate;
private void Update() {
if (OnUpdate != null) OnUpdate();
}
}
private static List<FunctionTimer> timerList; // Holds a reference to all active timers
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("FunctionTimer_Global");
timerList = new List<FunctionTimer>();
}
}
public static FunctionTimer Create(Action action, float timer) {
return Create(action, timer, "", false, false);
}
public static FunctionTimer Create(Action action, float timer, string functionName) {
return Create(action, timer, functionName, false, false);
}
public static FunctionTimer Create(Action action, float timer, string functionName, bool useUnscaledDeltaTime) {
return Create(action, timer, functionName, useUnscaledDeltaTime, false);
}
public static FunctionTimer Create(Action action, float timer, string functionName, bool useUnscaledDeltaTime, bool stopAllWithSameName) {
InitIfNeeded();
if (stopAllWithSameName) {
StopAllTimersWithName(functionName);
}
GameObject obj = new GameObject("FunctionTimer Object "+functionName, typeof(MonoBehaviourHook));
FunctionTimer funcTimer = new FunctionTimer(obj, action, timer, functionName, useUnscaledDeltaTime);
obj.GetComponent<MonoBehaviourHook>().OnUpdate = funcTimer.Update;
timerList.Add(funcTimer);
return funcTimer;
}
public static void RemoveTimer(FunctionTimer funcTimer) {
InitIfNeeded();
timerList.Remove(funcTimer);
}
public static void StopAllTimersWithName(string functionName) {
InitIfNeeded();
for (int i = 0; i < timerList.Count; i++) {
if (timerList[i].functionName == functionName) {
timerList[i].DestroySelf();
i--;
}
}
}
public static void StopFirstTimerWithName(string functionName) {
InitIfNeeded();
for (int i = 0; i < timerList.Count; i++) {
if (timerList[i].functionName == functionName) {
timerList[i].DestroySelf();
return;
}
}
}
private GameObject gameObject;
private float timer;
private string functionName;
private bool active;
private bool useUnscaledDeltaTime;
private Action action;
public FunctionTimer(GameObject gameObject, Action action, float timer, string functionName, bool useUnscaledDeltaTime) {
this.gameObject = gameObject;
this.action = action;
this.timer = timer;
this.functionName = functionName;
this.useUnscaledDeltaTime = useUnscaledDeltaTime;
}
private void Update() {
if (useUnscaledDeltaTime) {
timer -= Time.unscaledDeltaTime;
} else {
timer -= Time.deltaTime;
}
if (timer <= 0) {
// Timer complete, trigger Action
action();
DestroySelf();
}
}
private void DestroySelf() {
RemoveTimer(this);
if (gameObject != null) {
UnityEngine.Object.Destroy(gameObject);
}
}
/*
* Class to trigger Actions manually without creating a GameObject
* */
public class FunctionTimerObject {
private float timer;
private Action callback;
public FunctionTimerObject(Action callback, float timer) {
this.callback = callback;
this.timer = timer;
}
public void Update() {
Update(Time.deltaTime);
}
public void Update(float deltaTime) {
timer -= deltaTime;
if (timer <= 0) {
callback();
}
}
}
// Create a Object that must be manually updated through Update();
public static FunctionTimerObject CreateObject(Action callback, float timer) {
return new FunctionTimerObject(callback, timer);
}
}
}