using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using GraphProcessor;
using UnityEngine;
namespace NodeGraphProcessor.Examples
{
[System.Serializable]
///
/// This is the base class for every node that is executed by the conditional processor, it takes an executed bool as input to
///
public abstract class ConditionalNode : BaseNode, IConditionalNode
{
// These booleans will controls wether or not the execution of the folowing nodes will be done or discarded.
[Input(name = "Executed", allowMultiple = true)]
public ConditionalLink executed;
public abstract IEnumerable< ConditionalNode > GetExecutedNodes();
// Assure that the executed field is always at the top of the node port section
public override FieldInfo[] GetNodeFields()
{
var fields = base.GetNodeFields();
Array.Sort(fields, (f1, f2) => f1.Name == nameof(executed) ? -1 : 1);
return fields;
}
}
[System.Serializable]
///
/// This class represent a simple node which takes one event in parameter and pass it to the next node
///
public abstract class LinearConditionalNode : ConditionalNode, IConditionalNode
{
[Output(name = "Executes")]
public ConditionalLink executes;
public override IEnumerable< ConditionalNode > GetExecutedNodes()
{
// Return all the nodes connected to the executes port
return outputPorts.FirstOrDefault(n => n.fieldName == nameof(executes))
.GetEdges().Select(e => e.inputNode as ConditionalNode);
}
}
[System.Serializable]
///
/// This class represent a waitable node which invokes another node after a time/frame
///
public abstract class WaitableNode : LinearConditionalNode
{
[Output(name = "Execute After")]
public ConditionalLink executeAfter;
protected void ProcessFinished()
{
onProcessFinished.Invoke(this);
}
[HideInInspector]
public Action onProcessFinished;
public IEnumerable< ConditionalNode > GetExecuteAfterNodes()
{
return outputPorts.FirstOrDefault(n => n.fieldName == nameof(executeAfter))
.GetEdges().Select(e => e.inputNode as ConditionalNode);
}
}
}