179 lines
4.9 KiB
C#
179 lines
4.9 KiB
C#
using QFramework;
|
||
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using XMLTool;
|
||
|
||
public class OperationController : MonoSingleton<OperationController>
|
||
{
|
||
public struct StepExecute
|
||
{
|
||
public int index;
|
||
}
|
||
|
||
public struct OnNextStep
|
||
{
|
||
|
||
}
|
||
|
||
public struct StepStatusOnChange
|
||
{
|
||
public int curIndex;
|
||
public StepStatus status;
|
||
}
|
||
public enum StepStatus
|
||
{
|
||
NoStart,
|
||
Start,
|
||
Finished,
|
||
}
|
||
|
||
OperationController() { }
|
||
public Operation operation;
|
||
|
||
List<Step> steps = new List<Step>();
|
||
|
||
int index = -1;
|
||
|
||
bool isStepRun = false;
|
||
IAction curAction;
|
||
public override void OnSingletonInit()
|
||
{
|
||
base.OnSingletonInit();
|
||
|
||
TypeEventSystem.Global.Register<OnModuleStart>((arg) =>
|
||
{
|
||
Refresh();
|
||
}).UnRegisterWhenGameObjectDestroyed(gameObject);
|
||
}
|
||
|
||
public void Refresh()
|
||
{
|
||
Global.AppType operationType = Global.AppType.All;
|
||
foreach (var operation in Global.Instance.curModule.Operations)
|
||
{
|
||
if (string.IsNullOrEmpty(operation.moduleType) == false)
|
||
{
|
||
Enum.TryParse(operation.moduleType, out operationType);
|
||
}
|
||
if (Global.appTpe == operationType || operationType == Global.AppType.All)
|
||
{
|
||
this.operation = operation;
|
||
foreach (var item in operation.Steps)
|
||
{
|
||
AddStep(item);
|
||
}
|
||
TypeEventSystem.Global.Register<StepExecute>(OnExecute);
|
||
TypeEventSystem.Global.Register<OnNextStep>(OnNext);
|
||
TypeEventSystem.Global.Register<OnModuleQuit>(arg => Clear());
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
public void Clear()
|
||
{
|
||
curAction.Deinit();
|
||
steps.Clear();
|
||
TypeEventSystem.Global.UnRegister<OnModuleQuit>(arg => Clear());
|
||
TypeEventSystem.Global.UnRegister<StepExecute>(OnExecute);
|
||
TypeEventSystem.Global.UnRegister<OnNextStep>(OnNext);
|
||
|
||
}
|
||
|
||
private void OnNext(OnNextStep step)
|
||
{
|
||
Execute(this.index + 1);
|
||
}
|
||
|
||
private void OnExecute(StepExecute execute)
|
||
{
|
||
Execute(execute.index);
|
||
}
|
||
|
||
public void Begin()
|
||
{
|
||
index = 0;
|
||
Execute(index);
|
||
}
|
||
|
||
public void AddStep(Step step)
|
||
{
|
||
steps.Add(step);
|
||
if (step.SubSteps != null && step.SubSteps.Count > 0)
|
||
{
|
||
foreach (var subStep in step.SubSteps)
|
||
{
|
||
AddStep(subStep);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
public void Execute(int targetIndex)
|
||
{
|
||
if (isStepRun)
|
||
{
|
||
curAction?.Deinit();
|
||
}
|
||
if (targetIndex < steps.Count && targetIndex >= 0)
|
||
{
|
||
if (this.index < targetIndex)
|
||
{
|
||
for (int i = this.index + 1; i < targetIndex; i++)
|
||
{
|
||
// <20><><EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD> ֱ<><D6B1>ִ<EFBFBD><D6B4>
|
||
IAction finishAction = ActionHelper.GetActionAndSub(steps[i].Finished);
|
||
if (finishAction != null)
|
||
{
|
||
finishAction.Start(this);
|
||
}
|
||
TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = i, status = StepStatus.Finished });
|
||
|
||
}
|
||
curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start);
|
||
}
|
||
else if (this.index > targetIndex)
|
||
{
|
||
for (int i = this.index; i > targetIndex; i--)
|
||
{
|
||
// <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD> ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
IAction resetAction = ActionHelper.GetActionAndSub(steps[i].Reset);
|
||
if (resetAction != null)
|
||
{
|
||
resetAction.Start(this);
|
||
}
|
||
TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = i, status = StepStatus.NoStart });
|
||
|
||
}
|
||
curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start);
|
||
}
|
||
else
|
||
{
|
||
curAction = ActionHelper.GetActionAndSub(steps[targetIndex].Start);
|
||
}
|
||
if (curAction != null)
|
||
{
|
||
this.index = targetIndex;
|
||
isStepRun = true;
|
||
TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Start });
|
||
curAction.Start(this, () =>
|
||
{
|
||
isStepRun = false;
|
||
TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Finished });
|
||
});
|
||
}
|
||
else
|
||
{
|
||
this.index = targetIndex;
|
||
TypeEventSystem.Global.Send(new StepStatusOnChange() { curIndex = targetIndex, status = StepStatus.Finished });
|
||
Execute(this.index + 1);
|
||
}
|
||
}
|
||
}
|
||
}
|