mathe/Library/PackageCache/com.unity.visualscripting@1.9.0/Runtime/VisualScripting.State/FlowState.cs

100 lines
3.0 KiB
C#
Raw Normal View History

2024-09-20 20:30:10 +02:00
using System.ComponentModel;
using UnityEngine;
namespace Unity.VisualScripting
{
[SerializationVersion("A")]
[TypeIcon(typeof(FlowGraph))]
[DisplayName("Script State")]
public sealed class FlowState : NesterState<FlowGraph, ScriptGraphAsset>, IGraphEventListener
{
public FlowState() { }
public FlowState(ScriptGraphAsset macro) : base(macro) { }
#region Lifecycle
protected override void OnEnterImplementation(Flow flow)
{
if (flow.stack.TryEnterParentElement(this))
{
nest.graph.StartListening(flow.stack);
flow.stack.TriggerEventHandler(hook => hook == StateEventHooks.OnEnterState, new EmptyEventArgs(), parent => parent is SubgraphUnit, false);
flow.stack.ExitParentElement();
}
}
protected override void OnExitImplementation(Flow flow)
{
if (flow.stack.TryEnterParentElement(this))
{
flow.stack.TriggerEventHandler(hook => hook == StateEventHooks.OnExitState, new EmptyEventArgs(), parent => parent is SubgraphUnit, false);
(nest.graph as IGraphEventListener).StopListening(flow.stack, true);
flow.stack.ExitParentElement();
}
}
public void StartListening(GraphStack stack)
{
if (stack.TryEnterParentElement(this))
{
nest.graph.StartListening(stack);
stack.ExitParentElement();
}
}
void IGraphEventListener.StopListening(GraphStack stack, bool destroyed)
=> StopListening(stack, destroyed);
public void StopListening(GraphStack stack) => StopListening(stack, true);
public void StopListening(GraphStack stack, bool destroyed)
{
if (stack.TryEnterParentElement(this))
{
(nest.graph as IGraphEventListener).StopListening(stack, destroyed);
stack.ExitParentElement();
}
}
public bool IsListening(GraphPointer pointer)
{
return pointer.GetElementData<Data>(this).isActive;
}
#endregion
#region Factory
public override FlowGraph DefaultGraph()
{
return GraphWithEnterUpdateExit();
}
public static FlowState WithEnterUpdateExit()
{
var flowState = new FlowState();
flowState.nest.source = GraphSource.Embed;
flowState.nest.embed = GraphWithEnterUpdateExit();
return flowState;
}
public static FlowGraph GraphWithEnterUpdateExit()
{
return new FlowGraph
{
units =
{
new OnEnterState { position = new Vector2(-205, -215) },
new Update { position = new Vector2(-161, -38) },
new OnExitState { position = new Vector2(-205, 145) }
}
};
}
#endregion
}
}