Unity回合制游戏EventSystem如何在Update循环执行指定方法至_canExecuteCommand为真
实现步骤
- 首先新增存储重复执行方法的容器,这里用
HashSet<Action>避免重复注册同一方法 - 实现
Update生命周期方法,仅在_canExecuteCommand为false时遍历执行注册的方法 - 新增注册/注销重复方法的公共接口,方便外部指定需要执行的方法
- 补充原代码的遗漏逻辑:命令执行完后要从队列头部移除已执行的命令,避免重复执行第一条命令
修改后完整代码
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
相关产品推荐
相关产品推荐

