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 StateNode : Node
{
///
/// 进入触发条件
///
public enum EnterConditon
{
allFinish,
anyFinish
}
[LabelText("Enter进入条件")]
public EnterConditon enterConditon = EnterConditon.allFinish;
public enum EnterState
{
激活状态,
冻结状态
}
[ReadOnly]
public EnterState enterState = EnterState.冻结状态;
[PropertyOrder(10)]
[LabelText("监听nodes")]
[ValueDropdown("GetAllProcessName",IsUniqueList = true)]
public List listenStateNodes;
public virtual bool IsRuning { get; set; }
public virtual bool IsFinished { get; set; }
public virtual bool IsTiShi { get; set; }
///
/// State进入
///
public virtual void OnEnter()
{
enterState = EnterState.激活状态;
IsRuning = true;
}
///
/// State离开
///
public virtual void OnExit()
{
enterState = EnterState.冻结状态;
IsRuning = false;
IsFinished = true;
}
public virtual void InitState()
{
enterState = EnterState.冻结状态;
IsRuning = false;
IsFinished = false;
}
[Serializable]
public class Empty { }
///
/// 输入端连接的Node是否完成
///
public bool CheckEnterConnectState()
{
NodePort enterNodePort = GetInputPort("enter");
bool tmpResult = true;
foreach (var item in enterNodePort.GetConnections())
{
StateNode node = item.node as StateNode;
switch (enterConditon)
{
case EnterConditon.allFinish:
if (!node.IsFinished) return false;
break;
case EnterConditon.anyFinish:
if (node.IsFinished) return true;
break;
}
}
return tmpResult;
}
private IEnumerable GetAllProcessName()
{
for (int i = 0; i < ProcessManagement.Instance.processes.Count; i++)
{
yield return ProcessManagement.Instance.processes[i].processBase.GetPBDescribe();
}
}
}
}