using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
//流程中步骤节点控制基类 管理所有的前置和后置步骤 定义步骤激活和步骤完成行为
public abstract class StepNodeBase : MonoBehaviour
{
protected ProcessEnum currentProcess;//流程名称
[SerializeField]
protected bool autoFinishedStep;//激活时自动完成的步骤
[SerializeField]
string nodeName;
///
/// 节点名称
///
public string NodeName
{
get
{
return nodeName;
}
}
//[HideInInspector]
//节点完成情况
public NodeFinishState stepState;
public NodeFinishState StepState
{
get
{
return stepState;
}
}
//当前节点激活状态 避免重复激活
protected NodeActiceState nodeActiceState;
public NodeActiceState NodeActiceState
{
get
{
return nodeActiceState;
}
}
///
/// 前置节点 所有的前置节点满足后 启动本节点
///
public List preconditionNodes = new List();
///
/// 后置节点 本节点完成后 通知后置节点
///
public List postpositionNodes = new List();
public event UnityAction NodeFinished;//步骤完成
// Start is called before the first frame update
protected virtual void Awake()
{
ProcessManager.Instance.AddStep(this);//将操作物体加入当前流程控制器
}
///
/// 前置节点通知完成时
///
public void PreNodeFinished(StepNodeBase stepNode = null)
{
bool hasPNunFinised = false;
for (int i = 0; i < preconditionNodes.Count; i++)
{
if (preconditionNodes[i].StepState == NodeFinishState.unFinished)
{
hasPNunFinised = true;
break;
}
}
if (!hasPNunFinised)//前置节点都完成了 或者没有前置节点
{
stepState = NodeFinishState.unFinished;
Active();
Debug.Log($"{currentProcess}流程,前置条件均满足,{nodeName}激活");
}
}
///
/// 开始前先设置 流程 避免某些节点激活时自动完成 导致后续流程异常
///
///
public void SetProcess(ProcessEnum processEnum)
{
currentProcess = processEnum;
}
///
/// 流程开始时执行
///
///
public void ProcessStart()
{
stepState = NodeFinishState.unFinished;//开始时默认所有的 步骤均为完成
if (preconditionNodes.Count == 0)//无前置节点流程开始时 直接激活
{
//Debug.Log($"{currentProcess}流程开始时{nodeName}激活");
Active();
}
}
//流程结束时
public void ProcessStop()
{
UnActive();
}
///
/// 节点激活时执行
///
protected abstract void Active();
///
/// 退出激活状态时执行
///
protected abstract void UnActive();
///
/// 节点行为完成 退出激活状态 通知后续节点 由节点行为结束时调用
///
protected virtual void NodeFinised()
{
Debug.Log(NodeName + "步骤完成");
stepState = NodeFinishState.finished;
UnActive();
NodeFinished?.Invoke();//节点完成事件 通知外部的事件
ProcessManager.Instance.RecordFinisedStep(NodeName);//通知管理器本节点完成
//尝试启动后续节点
for (int i = 0; i < postpositionNodes.Count; i++)
{
postpositionNodes[i].PreNodeFinished(this);
}
}
}
//节点完成状态
public enum NodeFinishState
{
///
/// 已完成
///
finished,
///
/// 未完成
///
unFinished,
}
///
/// 节点激活状态
///
public enum NodeActiceState
{
///
/// 已激活状态
///
active,
///
/// 未激活状态
///
unActice,
}