This commit is contained in:
2025-01-17 13:10:42 +01:00
commit 4536213c91
15115 changed files with 1442174 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
using System.Collections.Generic;
using System.Linq;
namespace Unity.VisualScripting
{
[Analyser(typeof(FlowStateTransition))]
public class FlowStateTransitionAnalyser : NesterStateTransitionAnalyser<FlowStateTransition>
{
public FlowStateTransitionAnalyser(GraphReference reference, FlowStateTransition transition) : base(reference, transition) { }
protected override bool IsTraversed()
{
var graph = transition.nest.graph;
if (graph == null)
{
return false;
}
using (var recursion = Recursion.New(1))
{
foreach (var trigger in graph.GetUnitsRecursive(recursion).OfType<TriggerStateTransition>())
{
if (trigger.Analysis<UnitAnalysis>(context).isEntered)
{
return true;
}
}
}
return false;
}
protected override IEnumerable<Warning> Warnings()
{
foreach (var baseWarning in base.Warnings())
{
yield return baseWarning;
}
var graph = transition.nest.graph;
if (graph == null)
{
yield break;
}
using (var recursion = Recursion.New(1))
{
if (!graph.GetUnitsRecursive(recursion).OfType<IEventUnit>().Any())
{
yield return Warning.Caution("Transition graph is missing an event.");
}
}
using (var recursion = Recursion.New(1))
{
if (!graph.GetUnitsRecursive(recursion).OfType<TriggerStateTransition>().Any())
{
yield return Warning.Caution("Transition graph is missing a trigger unit.");
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1275e89e45fac4c26b82fda27d2d9647
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,106 @@
using System.Linq;
namespace Unity.VisualScripting
{
[Descriptor(typeof(FlowStateTransition))]
public class FlowStateTransitionDescriptor : NesterStateTransitionDescriptor<FlowStateTransition>
{
public FlowStateTransitionDescriptor(FlowStateTransition transition) : base(transition) { }
public override string Title()
{
var graph = transition.nest.graph;
if (graph != null)
{
if (!StringUtility.IsNullOrWhiteSpace(graph.title))
{
return graph.title;
}
using (var recursion = Recursion.New(1))
{
var events = graph.GetUnitsRecursive(recursion).OfType<IEventUnit>().ToList();
if (events.Count == 0)
{
return "(No Event)";
}
else if (events.Count == 1)
{
return events[0].Description().title;
}
else // if (events.Count > 1)
{
return "(Multiple Events)";
}
}
}
else
{
return "(No Transition)";
}
}
public override string Summary()
{
var graph = transition.nest.graph;
if (graph != null)
{
if (!StringUtility.IsNullOrWhiteSpace(graph.summary))
{
return graph.summary;
}
using (var recursion = Recursion.New(1))
{
var events = graph.GetUnitsRecursive(recursion).OfType<IEventUnit>().ToList();
if (events.Count == 0)
{
return "Open the transition graph to add an event.";
}
else if (events.Count == 1)
{
return events[0].Description().summary;
}
else // if (events.Count > 1)
{
return "Open the transition graph to see the full transition.";
}
}
}
else
{
return "Choose a source in the graph inspector.";
}
}
public override EditorTexture Icon()
{
var graph = transition.nest.graph;
using (var recursion = Recursion.New(1))
{
if (graph != null)
{
var events = graph.GetUnitsRecursive(recursion).OfType<IEventUnit>().ToList();
if (events.Count == 1)
{
return events[0].Description().icon;
}
else
{
return typeof(IStateTransition).Icon();
}
}
else
{
return typeof(IStateTransition).Icon();
}
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 355c8a593616d459494378fc4c6f39a2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
namespace Unity.VisualScripting
{
[Editor(typeof(FlowStateTransition))]
public sealed class FlowStateTransitionEditor : NesterStateTransitionEditor
{
public FlowStateTransitionEditor(Metadata metadata) : base(metadata) { }
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6a1240097a06b411090f9cb6c29cf64a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,44 @@
using UnityEditor;
using UnityEngine;
namespace Unity.VisualScripting
{
[Widget(typeof(FlowStateTransition))]
public sealed class FlowStateTransitionWidget : NesterStateTransitionWidget<FlowStateTransition>, IDragAndDropHandler
{
public FlowStateTransitionWidget(StateCanvas canvas, FlowStateTransition transition) : base(canvas, transition) { }
#region Drag & Drop
public DragAndDropVisualMode dragAndDropVisualMode => DragAndDropVisualMode.Generic;
public bool AcceptsDragAndDrop()
{
return DragAndDropUtility.Is<ScriptGraphAsset>();
}
public void PerformDragAndDrop()
{
UndoUtility.RecordEditedObject("Drag & Drop Macro");
transition.nest.source = GraphSource.Macro;
transition.nest.macro = DragAndDropUtility.Get<ScriptGraphAsset>();
transition.nest.embed = null;
GUI.changed = true;
}
public void UpdateDragAndDrop()
{
}
public void DrawDragAndDropPreview()
{
GraphGUI.DrawDragAndDropPreviewLabel(new Vector2(edgePosition.x, outerPosition.yMax), "Replace with: " + DragAndDropUtility.Get<ScriptGraphAsset>().name, typeof(ScriptGraphAsset).Icon());
}
public void ExitDragAndDrop()
{
}
#endregion
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 78c6207d792514839993cf7f713d79e2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
namespace Unity.VisualScripting
{
public interface IStateTransitionWidget : INodeWidget
{
Edge sourceEdge { get; }
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1b9a6728ed0414076b5bd0a744bb8b21
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,29 @@
using System.Collections.Generic;
namespace Unity.VisualScripting
{
[Analyser(typeof(INesterStateTransition))]
public class NesterStateTransitionAnalyser<TGraphNesterStateTransition> : StateTransitionAnalyser<TGraphNesterStateTransition>
where TGraphNesterStateTransition : class, INesterStateTransition
{
public NesterStateTransitionAnalyser(GraphReference reference, TGraphNesterStateTransition transition) : base(reference, transition) { }
protected override IEnumerable<Warning> Warnings()
{
foreach (var baseWarning in base.Warnings())
{
yield return baseWarning;
}
if (transition.childGraph == null)
{
yield return Warning.Caution("Missing transition graph.");
}
if (transition.nest.hasBackgroundEmbed)
{
yield return Warning.Caution("Background embed graph detected.");
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b41eaa7e036334f5abae76f726a02edc
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,21 @@
namespace Unity.VisualScripting
{
[Descriptor(typeof(INesterStateTransition))]
public class NesterStateTransitionDescriptor<TNesterStateTransition> : StateTransitionDescriptor<TNesterStateTransition>
where TNesterStateTransition : class, INesterStateTransition
{
public NesterStateTransitionDescriptor(TNesterStateTransition transition) : base(transition) { }
[RequiresUnityAPI]
public override string Title()
{
return GraphNesterDescriptor.Title(transition);
}
[RequiresUnityAPI]
public override string Summary()
{
return GraphNesterDescriptor.Summary(transition);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3ef8f00bbef6a4ceaaaa090c41d2cf23
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,30 @@
using UnityEngine;
namespace Unity.VisualScripting
{
[Editor(typeof(INesterStateTransition))]
public class NesterStateTransitionEditor : StateTransitionEditor
{
public NesterStateTransitionEditor(Metadata metadata) : base(metadata) { }
private Metadata nestMetadata => metadata[nameof(INesterStateTransition.nest)];
private Metadata graphMetadata => nestMetadata[nameof(IGraphNest.graph)];
protected override GraphReference headerReference => reference.ChildReference((INesterStateTransition)metadata.value, false);
protected override Metadata headerTitleMetadata => graphMetadata[nameof(IGraph.title)];
protected override Metadata headerSummaryMetadata => graphMetadata[nameof(IGraph.summary)];
protected override float GetInspectorHeight(float width)
{
return LudiqGUI.GetEditorHeight(this, nestMetadata, width);
}
protected override void OnInspectorGUI(Rect position)
{
LudiqGUI.Editor(nestMetadata, position);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 55db6890417fe448f800580347902eea
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
namespace Unity.VisualScripting
{
public abstract class NesterStateTransitionWidget<TNesterStateTransition> : StateTransitionWidget<TNesterStateTransition>
where TNesterStateTransition : class, INesterStateTransition
{
protected NesterStateTransitionWidget(StateCanvas canvas, TNesterStateTransition transition) : base(canvas, transition) { }
protected override IEnumerable<DropdownOption> contextOptions
{
get
{
var childReference = reference.ChildReference(transition, false);
if (childReference != null)
{
yield return new DropdownOption((Action)(() => window.reference = childReference), "Open");
yield return new DropdownOption((Action)(() => GraphWindow.OpenTab(childReference)), "Open in new window");
}
foreach (var baseOption in base.contextOptions)
{
yield return baseOption;
}
}
}
protected override void OnDoubleClick()
{
if (transition.graph.zoom == 1)
{
var childReference = reference.ChildReference(transition, false);
if (childReference != null)
{
if (e.ctrlOrCmd)
{
GraphWindow.OpenTab(childReference);
}
else
{
window.reference = childReference;
}
}
e.Use();
}
else
{
base.OnDoubleClick();
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 292c8b7edc601474ba17d63cd957dbff
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,27 @@
using System.Collections.Generic;
namespace Unity.VisualScripting
{
public abstract class StateTransitionAnalyser<TStateTransition> : Analyser<TStateTransition, StateTransitionAnalysis>
where TStateTransition : IStateTransition
{
protected StateTransitionAnalyser(GraphReference reference, TStateTransition target) : base(reference, target) { }
public TStateTransition transition => target;
[Assigns]
protected virtual bool IsTraversed()
{
return true;
}
[Assigns]
protected virtual IEnumerable<Warning> Warnings()
{
if (!IsTraversed())
{
yield return Warning.Info("Transition is never traversed.");
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4666c372b28594071897c42f3fd2f47e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
namespace Unity.VisualScripting
{
public sealed class StateTransitionDescription : GraphElementDescription
{
public string label { get; set; }
public string tooltip { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 2cf1e35e2ea20404cb31e0153aec76c7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,41 @@
namespace Unity.VisualScripting
{
public abstract class StateTransitionDescriptor<TStateTransition> : Descriptor<TStateTransition, StateTransitionDescription>
where TStateTransition : class, IStateTransition
{
protected StateTransitionDescriptor(TStateTransition target) : base(target) { }
public TStateTransition transition => target;
[Assigns]
public override string Title()
{
return "Transition";
}
[Assigns]
public override string Summary()
{
return null;
}
[Assigns]
public virtual string Label()
{
return Title();
}
[Assigns]
public virtual string Tooltip()
{
return Summary();
}
[Assigns]
[RequiresUnityAPI]
public override EditorTexture Icon()
{
return typeof(IStateTransition).Icon();
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 82e797f2fea594d6f89e0146757d0ed6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
namespace Unity.VisualScripting
{
[Editor(typeof(IStateTransition))]
public class StateTransitionEditor : GraphElementEditor<StateGraphContext>
{
public StateTransitionEditor(Metadata metadata) : base(metadata) { }
private IStateTransition transition => (IStateTransition)element;
protected new StateTransitionDescription description => (StateTransitionDescription)base.description;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9d4e73ed999c34cb3ae93178fcb08712
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3d4c55a931854453da3c5a0466ef9fb8
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,10 @@
namespace Unity.VisualScripting
{
[Widget(typeof(TriggerStateTransition))]
public sealed class TriggerStateTransitionWidget : UnitWidget<TriggerStateTransition>
{
public TriggerStateTransitionWidget(FlowCanvas canvas, TriggerStateTransition unit) : base(canvas, unit) { }
protected override NodeColorMix baseColor => NodeColorMix.TealReadable;
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b189625584c90451ebec9bd6a0e5e334
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: