#if VISUAL_SCRIPT_INTERNAL using System; using System.Reflection; using UnityEditor; using UnityEngine; namespace Unity.VisualScripting { public abstract class RuntimeGraphBase where TMacro : LudiqScriptableObject, IMacro where TGraph : IGraph where TCanvas : ICanvas where TMachine : IMachine { protected const string k_AssetPath = "Assets/test.asset"; protected TMacro m_Macro; protected TGraph m_Graph; protected TCanvas m_Canvas; protected TMachine m_Machine; protected GraphReference m_Reference; protected GameObject m_GameObject; } public abstract class RuntimeFlowGraph : RuntimeGraphBase { protected void CreateGraph() { m_Macro = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(m_Macro, k_AssetPath); m_Graph = m_Macro.graph; m_Canvas = new FlowCanvas(m_Graph); m_Reference = GraphReference.New(m_Macro, false); m_GameObject = new GameObject(); m_Machine = m_GameObject.AddComponent(); m_Machine.nest.macro = m_Macro; } protected void AddUnit(IUnit unit) { AddUnit(unit, Vector2.down); } protected void AddUnit(IUnit unit, Vector2 position) { Undo.IncrementCurrentGroup(); LudiqEditorUtility.editedObject.BeginOverride(m_Reference.serializedObject); m_Canvas.AddUnit(unit, position); LudiqEditorUtility.editedObject.EndOverride(); } protected void Connect(ControlOutput source, ControlInput destination) { Undo.IncrementCurrentGroup(); LudiqEditorUtility.editedObject.BeginOverride(m_Reference.serializedObject); var widget = new ControlOutputWidget(m_Canvas, source); var connectMethodInfo = GetConnectionMethodInfo(widget.GetType()); connectMethodInfo?.Invoke(widget, new object[] { widget.port, destination }); LudiqEditorUtility.editedObject.EndOverride(); } protected void Connect(ValueOutput source, ValueInput destination) { Undo.IncrementCurrentGroup(); LudiqEditorUtility.editedObject.BeginOverride(m_Reference.serializedObject); var widget = new ValueOutputWidget(m_Canvas, source); var connectMethodInfo = GetConnectionMethodInfo(widget.GetType()); connectMethodInfo?.Invoke(widget, new object[] { widget.port, destination }); LudiqEditorUtility.editedObject.EndOverride(); } static MethodInfo GetConnectionMethodInfo(Type type) { while (true) { if (!(type is null)) { foreach (var mi in type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)) { if (mi.Name == "FinishConnection") return mi; } type = type.BaseType; } } } } } #endif