/********************************* * 函数说明: 删除回调 * 返 回 值: void * 参数说明: callback * 参数说明: callbackRepeat * 注意事项: 无 *********************************/ void RemoveDelay(MsgCallback callback, MsgCallbackRepeat callbackRepeat) { // 定义一个延时回调句柄 DelayMsgHandler delayMsgHandler = default(DelayMsgHandler); // 检查参数 if (callback == null && callbackRepeat == null) { return; } // 检查是否已经添加过 int iCount = delayHandlerList.Count; for (int i = 0; i < iCount; i++) { delayMsgHandler = delayHandlerList[i]; // 销毁状态的话不处理 if (delayMsgHandler.state == OperateState.Remove) { continue; } // 检查回调的状态 if ((callback != null && delayMsgHandler.callback == callback) || (callbackRepeat != null && delayMsgHandler.callbackRepeat == callbackRepeat)) { // 移除上一条消息 而不是直接更新消息是因为 防止在Update的时候添加消息,造成同一帧执行 delayMsgHandler.state = OperateState.Remove; continue; } } // 启用脚本 this.enabled = true; }
/********************************* * 函数说明: 邮寄消息(延迟发送消息) * 返 回 值: void * 参数说明: message@消息ID,msgArg@消息附加参数,delay@延时时间 * 注意事项: 无 *********************************/ public void PostMessage(int message, object msgArg, float delay) { DelayMsgHandler delayMsg = new DelayMsgHandler(); delayMsg.message = message; delayMsg.msgArg = msgArg; delayMsg.delayTime = delay; delayMsg.currentTime = 0; delayHandlerList.Add(delayMsg); }
/********************************* * 函数说明: 添加一个延时回调 * 返 回 值: void * 参数说明: callback 回调函数 * 参数说明: callbackRepeat 回调函数 * 参数说明: msgArg 回调函数的参数 * 参数说明: delayFrame 延时帧数 最少一帧 * 参数说明: isSameFunctionCallOnce 在上一个回调函数还没有执行的是时候忽略同一个回调函数 * 参数说明: isSameFunctionChangeArg 如果一帧之内的同一个回调函数 那么我们是否更新参数 * 参数说明: isResetDelay 如果上一个回调函数等待执行,是否重置延时回调 * 注意事项: 无 *********************************/ void AddDelay(MsgCallback callback, MsgCallbackRepeat callbackRepeat, object msgArg, int delayFrame = 1, bool isSameFunctionCallOnce = true, bool isSameFunctionChangeArg = false, bool isReSetDelay = true) { // 定义一个延时回调句柄 DelayMsgHandler delayMsgHandler = default(DelayMsgHandler); // 检查参数 if (callback == null && callbackRepeat == null) { Debug.LogError("You can not add a null Delay Callback , check your args!"); return; } // 检查是否已经添加过 if (isSameFunctionCallOnce == true) { int iCount = delayHandlerList.Count; for (int i = 0; i < iCount; i++) { delayMsgHandler = delayHandlerList[i]; // 销毁状态的话不处理 if (delayMsgHandler.state == OperateState.Remove) { continue; } // 检查回调的状态 if ((callback != null && delayMsgHandler.callback == callback) || (callbackRepeat != null && delayMsgHandler.callbackRepeat == callbackRepeat)) { // 移除上一条消息 而不是直接更新消息是因为 防止在Update的时候添加消息,造成同一帧执行 delayMsgHandler.state = OperateState.Remove; // 更新消息参数 msgArg = isSameFunctionChangeArg == true ? msgArg : delayMsgHandler.msgArg; // 是否重置延时 delayFrame = isReSetDelay == true ? delayFrame : delayMsgHandler.delayframe; break; } } } // 添加一条新的消息到结尾 delayMsgHandler = new DelayMsgHandler(); delayMsgHandler.callback = callback; delayMsgHandler.callbackRepeat = callbackRepeat; delayMsgHandler.msgArg = msgArg; delayMsgHandler.state = OperateState.None; delayMsgHandler.delayframe = Mathf.Max(1, delayFrame); delayMsgHandler.maxframe = delayMsgHandler.delayframe; delayMsgHandler.Initialization(); delayHandlerList.Add(delayMsgHandler); // 启用脚本 this.enabled = true; }
/* 更新延时消息 */ public void Update() { // 延时发送消息 for (int i = 0; i < delayHandlerList.Count; i++) { DelayMsgHandler msgObject = delayHandlerList[i]; if (null == msgObject) { delayHandlerList.RemoveAt(i); i -= 1; } else { msgObject.currentTime += Time.deltaTime; if (msgObject.currentTime >= msgObject.delayTime) { SendMessage(msgObject.message, msgObject.msgArg); delayHandlerList.RemoveAt(i); i -= 1; } } } // 调度延时回调 for (int i = 0; i < delayCallbackList.Count; i++) { DelayCallback delayCallback = delayCallbackList[i]; delayCallback.currentTime += Time.deltaTime; if (delayCallback.currentTime >= delayCallback.delayTime) { delayCallback.callback(delayCallback.msgArg); delayCallbackList.RemoveAt(i); i -= 1; } } }