using System; using System.Collections.Generic; using UnityEngine; namespace TyphoonUI { /// /// UI活动队列 /// internal class UIOperationQueue : MonoBehaviour, IOperationQueue { private readonly Queue _queue = new Queue(); private UIOperationQueue() { } /// /// 是否在处理中 /// private bool _isHandling = false; /// /// 初始化 /// public void Initialize() { DontDestroyOnLoad(gameObject); UIOperation.OnStateChanged += OnOperationStatusChanged; } /// /// 加入队列 /// public IOperationQueue Enqueue(Action handler) { var operationHandler = UIOperation.Create((h) => { handler?.Invoke(); //默认执行完后完成 h.ToFinishStatus(); }); //加入队列 _queue.Enqueue(operationHandler); return this; } /// /// 加入队列 /// public IOperationQueue Enqueue(Action handler) { var operation = UIOperation.Create(handler); _queue.Enqueue(operation); return this; } /// /// 中断 /// public void Interrupt() { while (_queue.Count > 0) { var operation = _queue.Dequeue(); operation.Release(); } if (!_isHandling) { HandleOperation(); } } /// /// 执行队列 /// public void Run() { if (!_isHandling) { HandleOperation(); } } //处理活动队列 private void HandleOperation() { _isHandling = true; if (_queue.Count <= 0) { _isHandling = false; return; } while (_queue.Count > 0) { var peek = _queue.Peek(); if (peek.IsValid()) { _queue.Dequeue(); continue; } switch (peek.GetStatus()) { case OperationStatus.Ready: //执行行为 peek.Run(); break; case OperationStatus.Running: //执行中,暂时退出 _isHandling = false; return; case OperationStatus.Finish: var operation = _queue.Dequeue(); operation.Release(); break; } } if (_queue.Count <= 0) { _isHandling = false; } } private void OnOperationStatusChanged(long operationId) { if (_isHandling) { return; } //继续执行 if (_queue.Count > 0 && _queue.Peek().Id == operationId) { HandleOperation(); } } } }