93 lines
3.2 KiB
C#
93 lines
3.2 KiB
C#
|
#if VISUAL_SCRIPT_INTERNAL
|
||
|
using System;
|
||
|
using System.Reflection;
|
||
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Unity.VisualScripting
|
||
|
{
|
||
|
public abstract class RuntimeGraphBase<TMacro, TGraph, TCanvas, TMachine>
|
||
|
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<ScriptGraphAsset, FlowGraph, FlowCanvas, ScriptMachine>
|
||
|
{
|
||
|
protected void CreateGraph()
|
||
|
{
|
||
|
m_Macro = ScriptableObject.CreateInstance<ScriptGraphAsset>();
|
||
|
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<ScriptMachine>();
|
||
|
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
|