using System.Diagnostics; using System.Threading.Tasks; namespace WS { ///任务组件 public class WSTaskComponent : WSComponent { private ProcessManager process; ///流程管理期 private ProcessManager Process { get { if (process == null) process = Parent.Parent as ProcessManager; return process; } } ///Id public int Id { get { return Data.Id; } } ///名称 public string Name { get { return Data.Name; } } ///分数 public float Score { get { return Data.Score; } } ///是否完成 private bool isComplete; ///是否完成 public bool IsComplete { get { return isComplete; } set { if (value && !isComplete) { Process.OnCompleteVTaskCallback?.Invoke(Id); if (Data.Perform) Process.GetVTask(Data.PerformId).StartVTask(); } isComplete = value; } } ///数据 public WSTask Data; ///任务错误 public bool IsError; ///当前操作 private BaseOperate CurrentOperate; //帧循环 public void Update() { if (CurrentOperate != null) { if (!CurrentOperate.IsComplete) CurrentOperate.Update(); else SwitchOperate(); } } ///开始任务 public void StartVTask() { #if UNITY_EDITOR || DEBUG_MODEL Log.LogDebug($"进入任务:{Name} ID:{Id}", WSLogType.橙); #endif SwitchOperate(); } /// 跳任务 /// 倒序 public async Task JumpVTask(bool invertedorder) { try { int count = Data.Operates.Count; if (!invertedorder) { int startid = CurrentOperate != null ? CurrentOperate.Id : 0; if (CurrentOperate != null) { await CurrentOperate.EndState(); CurrentOperate.Dispose(); } for (int i = startid; i < count; i++) { await GetJumpOperate(i, invertedorder); } IsComplete = true; } else { IsComplete = false; int startid = CurrentOperate != null ? CurrentOperate.Id - 2 : count - 1; if (CurrentOperate != null) { await CurrentOperate?.StartState(); CurrentOperate?.Dispose(); } for (int i = startid; i >= 0; i--) { await GetJumpOperate(i, invertedorder); } } CurrentOperate = null; } catch (System.Exception ex) { Log.LogError(ex); } } ///获取跳转操作 /// 倒序 private async Task GetJumpOperate(int i, bool invertedorder) { BaseOperate operate = Process.GetOperate(Data.Operates[i], this); if (!invertedorder) await operate.EndState(); else await operate.StartState(); operate.Dispose(); } ///设置任务错误 public void SetVTaskError() { IsError = true; } ///获取关联任务 public WSTaskComponent GetContactVTask() { if (Data.Get) { return Process.GetVTask(Data.GetId); } return null; } ///提示 public void Prompt() { CurrentOperate.Prompt(); } ///切换操作 private void SwitchOperate() { if (CurrentOperate != null) { int index = CurrentOperate.Id; CurrentOperate.Dispose(); if (Data.Operates.Count > index) CurrentOperate = Process.GetOperate(Data.Operates[index], this); else IsComplete = true; } else CurrentOperate = Process.GetOperate(Data.Operates[0], this); if (!IsComplete) CurrentOperate.StartOperate(); } public override void Dispose() { base.Dispose(); isComplete = false; Data = null; IsError = false; if (CurrentOperate != null) { if (!CurrentOperate.IsDisposed) CurrentOperate.Dispose(); CurrentOperate = null; } } } }