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;
}
}
}
}