using UnityEngine;
using System.Collections.Generic;
using System;
using System.ComponentModel;
using System.Threading;
using System.Collections;
public static class MonoBehaviourExtension
{
public static void InvokeWaitForSeconds(this MonoBehaviour monoBehaviour, Action action, float time)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, new WaitForSeconds(time)));
}
public static void InvokeRepeatingWaitForSeconds(this MonoBehaviour monoBehaviour, Action action, float time, int count = 0xfffffff)
{
if (action == null)
return;
monoBehaviour.StartCoroutine(RepeatingActionCoroutine(action, new WaitForSeconds(time), count));
}
public static void InvokeWaitForEndOfFrame(this MonoBehaviour monoBehaviour, Action action)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, new WaitForEndOfFrame()));
}
public static void InvokeWaitForFixedUpdate(this MonoBehaviour monoBehaviour, Action action)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, new WaitForFixedUpdate()));
}
public static void InvokeWaitForYieldInstruction(this MonoBehaviour monoBehaviour, Action action, YieldInstruction yieldInstruction)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, yieldInstruction));
}
public static void InvokeWaitForYieldInstruction<T>(this MonoBehaviour monoBehaviour, Action<T> action, YieldInstruction yieldInstruction) where T : YieldInstruction
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, yieldInstruction));
}
private static IEnumerator ActionCoroutine(Action action, YieldInstruction yieldInstruction)
{
yield return yieldInstruction;
if (action != null)
action();
}
private static IEnumerator ActionCoroutine<T>(Action<T> action, YieldInstruction yieldInstruction) where T : YieldInstruction
{
yield return yieldInstruction;
if (action != null)
action(yieldInstruction as T);
}
private static IEnumerator RepeatingActionCoroutine(Action action, WaitForSeconds waitForSeconds, int count)
{
while (count != 0)
{
yield return waitForSeconds;
action();
count--;
}
}
#region Invoke
private static Dictionary<BackgroundWorker, Action> actions = new Dictionary<BackgroundWorker, Action>();
public static void Invoke(this MonoBehaviour monoBehaviour, Action action, float time)
{
if (action == null)
return;
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += DoWorkEventHandler;
backgroundWorker.RunWorkerCompleted += RunWorkerCompletedEventHandler;
//backgroundWorker.WorkerSupportsCancellation = true;
actions[backgroundWorker] = action;
backgroundWorker.RunWorkerAsync((int)(time * 1000));
}
private static void DoWorkEventHandler(object sender, DoWorkEventArgs e)
{
Thread.Sleep((int)e.Argument);
}
private static void RunWorkerCompletedEventHandler(object sender, RunWorkerCompletedEventArgs e)
{
//if (e.Cancelled)
// return;
if (e.Error != null)
{
Debug.LogException(e.Error);
return;
}
BackgroundWorker backgroundWorker = sender as BackgroundWorker;
Action action;
if (actions.TryGetValue(backgroundWorker, out action))
{
ThreadHelper.QueueOnMainThread(action);
actions.Remove(backgroundWorker);
}
}
#endregion
}
using System.Collections.Generic;
using System;
using System.ComponentModel;
using System.Threading;
using System.Collections;
public static class MonoBehaviourExtension
{
public static void InvokeWaitForSeconds(this MonoBehaviour monoBehaviour, Action action, float time)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, new WaitForSeconds(time)));
}
public static void InvokeRepeatingWaitForSeconds(this MonoBehaviour monoBehaviour, Action action, float time, int count = 0xfffffff)
{
if (action == null)
return;
monoBehaviour.StartCoroutine(RepeatingActionCoroutine(action, new WaitForSeconds(time), count));
}
public static void InvokeWaitForEndOfFrame(this MonoBehaviour monoBehaviour, Action action)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, new WaitForEndOfFrame()));
}
public static void InvokeWaitForFixedUpdate(this MonoBehaviour monoBehaviour, Action action)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, new WaitForFixedUpdate()));
}
public static void InvokeWaitForYieldInstruction(this MonoBehaviour monoBehaviour, Action action, YieldInstruction yieldInstruction)
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, yieldInstruction));
}
public static void InvokeWaitForYieldInstruction<T>(this MonoBehaviour monoBehaviour, Action<T> action, YieldInstruction yieldInstruction) where T : YieldInstruction
{
monoBehaviour.StartCoroutine(ActionCoroutine(action, yieldInstruction));
}
private static IEnumerator ActionCoroutine(Action action, YieldInstruction yieldInstruction)
{
yield return yieldInstruction;
if (action != null)
action();
}
private static IEnumerator ActionCoroutine<T>(Action<T> action, YieldInstruction yieldInstruction) where T : YieldInstruction
{
yield return yieldInstruction;
if (action != null)
action(yieldInstruction as T);
}
private static IEnumerator RepeatingActionCoroutine(Action action, WaitForSeconds waitForSeconds, int count)
{
while (count != 0)
{
yield return waitForSeconds;
action();
count--;
}
}
#region Invoke
private static Dictionary<BackgroundWorker, Action> actions = new Dictionary<BackgroundWorker, Action>();
public static void Invoke(this MonoBehaviour monoBehaviour, Action action, float time)
{
if (action == null)
return;
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += DoWorkEventHandler;
backgroundWorker.RunWorkerCompleted += RunWorkerCompletedEventHandler;
//backgroundWorker.WorkerSupportsCancellation = true;
actions[backgroundWorker] = action;
backgroundWorker.RunWorkerAsync((int)(time * 1000));
}
private static void DoWorkEventHandler(object sender, DoWorkEventArgs e)
{
Thread.Sleep((int)e.Argument);
}
private static void RunWorkerCompletedEventHandler(object sender, RunWorkerCompletedEventArgs e)
{
//if (e.Cancelled)
// return;
if (e.Error != null)
{
Debug.LogException(e.Error);
return;
}
BackgroundWorker backgroundWorker = sender as BackgroundWorker;
Action action;
if (actions.TryGetValue(backgroundWorker, out action))
{
ThreadHelper.QueueOnMainThread(action);
actions.Remove(backgroundWorker);
}
}
#endregion
}