You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity回合制游戏EventSystem如何在Update循环执行指定方法至_canExecuteCommand为真

实现步骤

  1. 首先新增存储重复执行方法的容器,这里用HashSet<Action>避免重复注册同一方法
  2. 实现Update生命周期方法,仅在_canExecuteCommand为false时遍历执行注册的方法
  3. 新增注册/注销重复方法的公共接口,方便外部指定需要执行的方法
  4. 补充原代码的遗漏逻辑:命令执行完后要从队列头部移除已执行的命令,避免重复执行第一条命令

修改后完整代码

public class EventSystem : MonoBehaviour
{
    private static List<Action> _commandsQueue = new List<Action>();
    // 存储需要在Update中重复执行的方法
    private static HashSet<Action> _updateMethods = new HashSet<Action>();
    
    private bool _canExecuteCommand = true;

    public void AddToQueue(Action command)
    {
        _commandsQueue.Add(command);
    }

    private void StartCommandExecution()
    {
        _commandsQueue[0]();
        _commandsQueue.RemoveAt(0); // 移除已执行的命令,修复原代码逻辑漏洞
        _canExecuteCommand = false;
    }

    public void CommandExecutionComplete()
    {
        _canExecuteCommand = true;
    }

    public void PlayFirstCommandFromQueue()
    {
        if (_commandsQueue.Any() && _canExecuteCommand)
        {
            StartCommandExecution();
        }
        else
        {
            Debug.LogError("No Command In Queue");
        }
    }

    // 注册需要在命令执行期间重复运行的方法
    public void RegisterUpdateMethod(Action updateMethod)
    {
        if (!_updateMethods.Contains(updateMethod))
        {
            _updateMethods.Add(updateMethod);
        }
    }

    // 注销不需要再重复运行的方法
    public void UnregisterUpdateMethod(Action updateMethod)
    {
        if (_updateMethods.Contains(updateMethod))
        {
            _updateMethods.Remove(updateMethod);
        }
    }

    private void Update()
    {
        // 仅在命令执行过程中运行注册的重复方法
        if (!_canExecuteCommand)
        {
            foreach (var method in _updateMethods)
            {
                method?.Invoke();
            }
        }
    }
}

使用示例

如果需要在命令执行期间播放等待动画、刷新计时UI,只需在初始化时调用注册接口即可:

// 注册等待动画刷新方法
eventSystemInstance.RegisterUpdateMethod(UpdateWaitingAnimation);
// 注册计时UI刷新方法
eventSystemInstance.RegisterUpdateMethod(UpdateCountdownUI);

不需要对应方法重复执行时,调用UnregisterUpdateMethod接口移除即可。

内容的提问来源于stack exchange,提问作者user14457752

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 03:12:03