Exemple #1
0
    /*********************************
    * 函数说明: 删除回调
    * 返 回 值: 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;
    }
Exemple #2
0
    /*********************************
    * 函数说明: 邮寄消息(延迟发送消息)
    * 返 回 值: 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);
    }
Exemple #3
0
    /*********************************
    * 函数说明: 添加一个延时回调
    * 返 回 值: 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;
    }
Exemple #4
0
    /* 更新延时消息 */
    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;
            }
        }
    }