using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XNode;
using System;
using Sirenix.OdinInspector;
using System.Linq;
using ChivaXR;
namespace ChivaVR.State
{
///
/// 运行状态
///
public class RunStateNode : StateNode
{
[Input, HideInInspector] public Empty enter;
[Output, HideInInspector] public Empty exit;
[ValueDropdown("GetProcedure", IsUniqueList = true)]
[OnValueChanged("ResetCurrentProcedure")]
[HideLabel]
public int currentProcedureStepID;
[ReadOnly]
public string currentProcedureDescription;
private static IEnumerable GetProcedure()
{
return ProcessManagement.Instance.processes.Select(x => new ValueDropdownItem(x.processBase.GetPBDescribe(), x.stepID));
}
private ProcessElement currentProcedure;
public ProcessElement CurrentProcedure
{
get
{
if (currentProcedure == null)
{
currentProcedure = GetCurrentProcedureByDescription();
}
return currentProcedure;
}
}
public void ResetCurrentProcedure()
{
currentProcedure = GetCurrentProcedureByStepID();
currentProcedureDescription = currentProcedure.processBase.GetPBDescribe();
}
public void UpdataCurrentProcedureDescription()
{
if (currentProcedure == null) return;
currentProcedureDescription = currentProcedure.processBase.GetPBDescribe();
}
///
/// 获取当前流程
///
///
public ProcessElement GetCurrentProcedureByStepID()
{
if (currentProcedureStepID == 0) return null;
if (ProcessManagement.Instance.processes.Where(x => (x.stepID.Equals(currentProcedureStepID))).Count() == 0)
{
GetCurrentProcedureByDescription();
return null;
}
return ProcessManagement.Instance.processes.Where(x => (x.stepID.Equals(currentProcedureStepID))).First();
}
///
/// 获取当前流程
///
///
public ProcessElement GetCurrentProcedureByDescription()
{
if (ProcessManagement.Instance.processes.Where(x => (x.processBase.GetPBDescribe().Equals(currentProcedureDescription))).Count() == 0)
{
currentProcedureDescription = "未找到对应Procedure";
return null;
}
return ProcessManagement.Instance.processes.Where(x => (x.processBase.GetPBDescribe().Equals(currentProcedureDescription))).First();
}
public override bool IsRuning { get => base.IsRuning; set => base.IsRuning = value; }
public override bool IsFinished
{
get
{
if (CurrentProcedure != null)
{
return CurrentProcedure.finished;
}
return false;
}
}
public override bool IsTiShi { get => base.IsTiShi; set => base.IsTiShi = value; }
StateGraph stateGraph;
[LabelText("分数:")]
public int score = 1;
public override void OnEnter()
{
base.OnEnter();
stateGraph = graph as StateGraph;
NodePort enterPort = GetInputPort("enter");
if (enterPort.GetConnections().Count == 0) return;
for (int i = 0; i < enterPort.GetConnections().Count; i++)
{
StateNode node = enterPort.GetConnection(i).node as StateNode;
if (!node.IsFinished) return;
}
IsRuning = true;
CurrentProcedure.SetEnterState(true);
CurrentProcedure.Enter();
CurrentProcedure.processElementExitHandle += FinishedProcedure;
}
///
/// 1.清空启用节点池
/// 2.得到最新开启的节点存到池中
///
public override void OnExit()
{
base.OnExit();
stateGraph.OnNodeExitState(this);
NodePort exitPort = GetOutputPort("exit");
if (IsFinished && !IsTiShi)
{
//StudentExamManager.Instance.currentExammingStudentInfo.totleScore += score;
}
if (!exitPort.IsConnected)
{
Debug.LogWarning("Node isn't connected");
return;
}
for (int i = 0; i < exitPort.GetConnections().Count; i++)
{
StateNode node = exitPort.GetConnection(i).node as StateNode;
node.OnEnter();
}
}
public void FindListenNodeState()
{
StateGraph StateGraph = ProcessManagement.Instance.stateGraph;
List stateNodes = new List();
foreach (var item in listenStateNodes)
{
}
}
public void FinishedProcedure(ProcessElement currentProcess)
{
Debug.Log("完成" + currentProcedure.name);
currentProcess.processElementExitHandle -= FinishedProcedure;
OnExit();
}
///
/// 获取本节点前没有完成的Nodes
///
///
///
public List GetEnterPortNoFinishedNode()
{
return ErgodicEnterPortNoFinishedNodes(this);
}
///
/// 遍历输入节点的所有没有完成的Nodes
///
public List ErgodicEnterPortNoFinishedNodes(RunStateNode runNode)
{
List stateNodes = new List();
NodePort enterPort = runNode.GetInputPort("enter");
foreach (NodePort item in enterPort.GetConnections())
{
StateNode node = item.node as StateNode;
if (!node.IsFinished)
{
stateNodes.Add(node as RunStateNode);
ErgodicEnterPortNoFinishedNodes(node as RunStateNode);
}
else
{
continue;
}
}
return stateNodes;
}
}
}