88 lines
2.6 KiB
C#
88 lines
2.6 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|