Unity3D不继承MonoBehaviour的类需要Invoke、StartCoroutine的运用

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
/// <summary>
/// 方法执行工具
/// </summary>
public static class MethodExeTool 
{ static private ToolScript _script; /// <summary> /// 工具脚本 /// </summary> /// <value>The coroutine object.</value> static private ToolScript script{ get{ if(_script==null){ GameObject go=new GameObject("toolObj"); _script=go.AddComponent<ToolScript>(); } return _script; } } /// <summary> /// 启动协程 /// </summary> /// <param name="enumerator">Enumerator.</param> static public void StartCoroutine(IEnumerator enumerator){ script.StartCoroutine (enumerator); } /// <summary> /// 循环调用 /// </summary> /// <param name="method">Method.</param> /// <param name="time">Time.</param> /// <param name="repeat">Repeat.</param> static public void Invoke(InvokeHandler.Handler method,float time,int repeat=1){ InvokeHandler temp = new InvokeHandler (); temp.method = method; temp.repeatTime = time; temp.repeat = repeat; script.AddHandler(temp); } /// <summary> /// 取消循环调用 /// </summary> /// <returns><c>true</c> if cancel invoke the specified method; otherwise, <c>false</c>.</returns> /// <param name="method">Method.</param> static public void CancelInvoke(InvokeHandler.Handler method){ script.RemoveHandler (method); } /// <summary> /// 循环调用结构 /// </summary> public class InvokeHandler{ /// <summary> /// 委托 /// </summary> public delegate void Handler(); public Handler method; /// <summary> /// 间隔时间 /// </summary> public float repeatTime=1f; /// <summary> /// 调用次数 /// </summary> public int repeat=1; /// <summary> /// 当前时间 /// </summary> public float curTime=0f; /// <summary> /// 是否完成 /// </summary> /// <value><c>true</c> if this instance is complete; otherwise, <c>false</c>.</value> public bool IsComplete{ get{ return repeat<1; } } /// <summary> /// 更新时间 /// </summary> /// <param name="time">Time.</param> public void AddTime(float time){ curTime += time; if (curTime >= repeatTime) { curTime-=repeatTime; execute(); } } /// <summary> /// 执行 /// </summary> void execute(){ if (repeat > 0) { if(method!=null){ method(); } } repeat--; } } } /// <summary> /// 工具脚本类 /// </summary> class ToolScript :MonoBehaviour{ /// <summary> /// 循环调用列表 /// </summary> private Dictionary<MethodExeTool.InvokeHandler.Handler,MethodExeTool.InvokeHandler> handlerList = new Dictionary<MethodExeTool.InvokeHandler.Handler, MethodExeTool.InvokeHandler> (); /// <summary> /// 更新时间 /// </summary> void Update(){ foreach (MethodExeTool.InvokeHandler temp in handlerList.Values) { temp.AddTime(Time.deltaTime); } DeleteComplete (); } /// <summary> /// 删除已完成 /// </summary> void DeleteComplete(){ List<MethodExeTool.InvokeHandler> list = new List<MethodExeTool.InvokeHandler> (); foreach (MethodExeTool.InvokeHandler temp in handlerList.Values) { if(temp.IsComplete){ list.Add(temp); } } foreach (MethodExeTool.InvokeHandler del in list) { handlerList.Remove(del.method); } } /// <summary> /// 添加调用 /// </summary> /// <param name="temp">Temp.</param> public void AddHandler(MethodExeTool.InvokeHandler temp){ RemoveHandler (temp.method); handlerList.Add (temp.method, temp); } /// <summary> /// 删除调用 /// </summary> /// <param name="method">Method.</param> public void RemoveHandler(MethodExeTool.InvokeHandler.Handler method){ if (handlerList.ContainsKey (method)) { handlerList.Remove(method); } } }

http://www.unitymanual.com/thread-21718-1-1.html

posted on 2020-02-28 10:23  小魔一剑  阅读(1785)  评论(0编辑  收藏  举报