using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace XNode.Flow { public abstract class FlowNode : Node { public override object GetValue(NodePort port) { if (port.IsConnected && port.Connection.node is FlowNode flowNode) return flowNode; return null; } public virtual IEnumerator Perform() { yield break; } public virtual IEnumerable PreviousNodes => Array.Empty(); public virtual IEnumerable NextNodes => Array.Empty(); public FlowNode GetFlowNode(string portName) => GetValue(GetPort(portName)) as FlowNode; } public abstract class InFlowNode : FlowNode { [Input(ShowBackingValue.Never, ConnectionType.Multiple, TypeConstraint.Inherited)] [SerializeField, HideInInspector] public FlowNode previousNode; public override IEnumerable PreviousNodes { get { yield return GetFlowNode("previousNodes"); } } } public abstract class OutFlowNode : FlowNode { [Output(ShowBackingValue.Never, ConnectionType.Multiple, TypeConstraint.Inherited)] [SerializeField, HideInInspector] public FlowNode nextNode; public override IEnumerable NextNodes { get { yield return GetFlowNode("nextNode"); } } } public abstract class InOutFlowNode : FlowNode { [Input(ShowBackingValue.Never, ConnectionType.Multiple, TypeConstraint.Inherited)] [SerializeField, HideInInspector] public FlowNode previousNode; [Output(ShowBackingValue.Never, ConnectionType.Multiple, TypeConstraint.Inherited)] [SerializeField, HideInInspector] public FlowNode nextNode; public override IEnumerable PreviousNodes { get { yield return GetFlowNode("previousNodes"); } } public override IEnumerable NextNodes { get { yield return GetFlowNode("nextNode"); } } } }