123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- using System;
- using UnityEngine;
-
- namespace Unity.VisualScripting
- {
- [UnitCategory("Graphs/Graph Nodes")]
- public abstract class SetGraph<TGraph, TMacro, TMachine> : Unit
- where TGraph : class, IGraph, new()
- where TMacro : Macro<TGraph>
- where TMachine : Machine<TGraph, TMacro>
- {
- /// <summary>
- /// The entry point for the node.
- /// </summary>
- [DoNotSerialize]
- [PortLabelHidden]
- public ControlInput enter { get; protected set; }
-
- /// <summary>
- /// The GameObject or the ScriptMachine where the graph will be set.
- /// </summary>
- [DoNotSerialize]
- [PortLabelHidden]
- [NullMeansSelf]
- public ValueInput target { get; protected set; }
-
- /// <summary>
- /// The script graph.
- /// </summary>
- [DoNotSerialize]
- [PortLabel("Graph")]
- [PortLabelHidden]
- public ValueInput graphInput { get; protected set; }
-
- /// <summary>
- /// The graph that has been set to the ScriptMachine.
- /// </summary>
- [DoNotSerialize]
- [PortLabel("Graph")]
- [PortLabelHidden]
- public ValueOutput graphOutput { get; protected set; }
-
- /// <summary>
- /// The action to execute once the graph has been set.
- /// </summary>
- [DoNotSerialize]
- [PortLabelHidden]
- public ControlOutput exit { get; protected set; }
-
- protected abstract bool isGameObject { get; }
- Type targetType => isGameObject ? typeof(GameObject) : typeof(TMachine);
-
- protected override void Definition()
- {
- enter = ControlInput(nameof(enter), SetMacro);
- target = ValueInput(targetType, nameof(target)).NullMeansSelf();
- target.SetDefaultValue(targetType.PseudoDefault());
-
- graphInput = ValueInput<TMacro>(nameof(graphInput), null);
- graphOutput = ValueOutput<TMacro>(nameof(graphOutput));
- exit = ControlOutput(nameof(exit));
-
- Requirement(graphInput, enter);
- Assignment(enter, graphOutput);
- Succession(enter, exit);
- }
-
- ControlOutput SetMacro(Flow flow)
- {
- var macro = flow.GetValue<TMacro>(graphInput);
- var targetValue = flow.GetValue(target, targetType);
-
- if (targetValue is GameObject go)
- {
- go.GetComponent<TMachine>().nest.SwitchToMacro(macro);
- }
- else
- {
- ((TMachine)targetValue).nest.SwitchToMacro(macro);
- }
-
- flow.SetValue(graphOutput, macro);
-
- return exit;
- }
- }
- }
|