Maze / Library /PackageCache /com.unity.visualscripting@1.8.0 /Runtime /VisualScripting.Flow /FlowGraph.cs
| using System; | |
| using System.Collections.Generic; | |
| using System.ComponentModel; | |
| using System.Linq; | |
| using UnityEngine; | |
| namespace Unity.VisualScripting | |
| { | |
| [] | |
| [] | |
| public sealed class FlowGraph : Graph, IGraphWithVariables, IGraphEventListener | |
| { | |
| public FlowGraph() | |
| { | |
| units = new GraphElementCollection<IUnit>(this); | |
| controlConnections = new GraphConnectionCollection<ControlConnection, ControlOutput, ControlInput>(this); | |
| valueConnections = new GraphConnectionCollection<ValueConnection, ValueOutput, ValueInput>(this); | |
| invalidConnections = new GraphConnectionCollection<InvalidConnection, IUnitOutputPort, IUnitInputPort>(this); | |
| groups = new GraphElementCollection<GraphGroup>(this); | |
| sticky = new GraphElementCollection<StickyNote>(this); | |
| elements.Include(units); | |
| elements.Include(controlConnections); | |
| elements.Include(valueConnections); | |
| elements.Include(invalidConnections); | |
| elements.Include(groups); | |
| elements.Include(sticky); | |
| controlInputDefinitions = new UnitPortDefinitionCollection<ControlInputDefinition>(); | |
| controlOutputDefinitions = new UnitPortDefinitionCollection<ControlOutputDefinition>(); | |
| valueInputDefinitions = new UnitPortDefinitionCollection<ValueInputDefinition>(); | |
| valueOutputDefinitions = new UnitPortDefinitionCollection<ValueOutputDefinition>(); | |
| variables = new VariableDeclarations(); | |
| } | |
| public override IGraphData CreateData() | |
| { | |
| return new FlowGraphData(this); | |
| } | |
| public void StartListening(GraphStack stack) | |
| { | |
| stack.GetGraphData<FlowGraphData>().isListening = true; | |
| foreach (var unit in units) | |
| { | |
| (unit as IGraphEventListener)?.StartListening(stack); | |
| } | |
| } | |
| public void StopListening(GraphStack stack) | |
| { | |
| foreach (var unit in units) | |
| { | |
| (unit as IGraphEventListener)?.StopListening(stack); | |
| } | |
| stack.GetGraphData<FlowGraphData>().isListening = false; | |
| } | |
| public bool IsListening(GraphPointer pointer) | |
| { | |
| return pointer.GetGraphData<FlowGraphData>().isListening; | |
| } | |
| [] | |
| public VariableDeclarations variables { get; private set; } | |
| public IEnumerable<string> GetDynamicVariableNames(VariableKind kind, GraphReference reference) | |
| { | |
| return units.OfType<IUnifiedVariableUnit>() | |
| .Where(v => v.kind == kind && Flow.CanPredict(v.name, reference)) | |
| .Select(v => Flow.Predict<string>(v.name, reference)) | |
| .Where(name => !StringUtility.IsNullOrWhiteSpace(name)) | |
| .Distinct() | |
| .OrderBy(name => name); | |
| } | |
| [] | |
| public GraphElementCollection<IUnit> units { get; private set; } | |
| [] | |
| public GraphConnectionCollection<ControlConnection, ControlOutput, ControlInput> controlConnections { get; private set; } | |
| [] | |
| public GraphConnectionCollection<ValueConnection, ValueOutput, ValueInput> valueConnections { get; private set; } | |
| [] | |
| public GraphConnectionCollection<InvalidConnection, IUnitOutputPort, IUnitInputPort> invalidConnections { get; private set; } | |
| [] | |
| public GraphElementCollection<GraphGroup> groups { get; private set; } | |
| [] | |
| public GraphElementCollection<StickyNote> sticky { get; private set; } | |
| private const string DefinitionRemoveWarningTitle = "Remove Port Definition"; | |
| private const string DefinitionRemoveWarningMessage = "Removing this definition will break any existing connection to this port. Are you sure you want to continue?"; | |
| [] | |
| [] | |
| [] | |
| [] | |
| public UnitPortDefinitionCollection<ControlInputDefinition> controlInputDefinitions { get; private set; } | |
| [] | |
| [] | |
| [] | |
| [] | |
| public UnitPortDefinitionCollection<ControlOutputDefinition> controlOutputDefinitions { get; private set; } | |
| [] | |
| [] | |
| [] | |
| [] | |
| public UnitPortDefinitionCollection<ValueInputDefinition> valueInputDefinitions { get; private set; } | |
| [] | |
| [] | |
| [] | |
| [] | |
| public UnitPortDefinitionCollection<ValueOutputDefinition> valueOutputDefinitions { get; private set; } | |
| public IEnumerable<IUnitPortDefinition> validPortDefinitions => | |
| LinqUtility.Concat<IUnitPortDefinition>(controlInputDefinitions, | |
| controlOutputDefinitions, | |
| valueInputDefinitions, | |
| valueOutputDefinitions) | |
| .Where(upd => upd.isValid) | |
| .DistinctBy(upd => upd.key); | |
| public event Action onPortDefinitionsChanged; | |
| public void PortDefinitionsChanged() | |
| { | |
| onPortDefinitionsChanged?.Invoke(); | |
| } | |
| public static FlowGraph WithInputOutput() | |
| { | |
| return new FlowGraph() | |
| { | |
| units = | |
| { | |
| new GraphInput() { position = new Vector2(-250, -30) }, | |
| new GraphOutput() { position = new Vector2(105, -30) } | |
| } | |
| }; | |
| } | |
| public static FlowGraph WithStartUpdate() | |
| { | |
| return new FlowGraph() | |
| { | |
| units = | |
| { | |
| new Start() { position = new Vector2(-204, -144) }, | |
| new Update() { position = new Vector2(-204, 60) } | |
| } | |
| }; | |
| } | |
| } | |
| } | |