1.创建一个GraphView

1.1 ScriptableObject类

通过继承 ScriptableObject 来将数据持久化,保存为 .asset 资源文件,添加 [CreateAssetMenu(menuName= "路径",fileName = “文件名”,order = 0)] Attribute来创建。

[CreateAssetMenu(menuName  = "GraphView/ScriptGraphAsset")]
public class ScriptGraphAsset : ScriptableObject{}

1.2 GraphView类

Unity2018版本加入的一个节点绘制系统, 属于Unity APIUnityEditor.Experimental.GraphView 命名空间下,使用的是UnityEngine.UIElements一块的内容来实现的。

using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine.UIElements;

public class GraphViewBase : GraphView
{
    protected ScriptGraphAsset m_graphAsset = null;

    public GraphViewBase(ScriptGraphAsset graphAsset)
    {
        m_graphAsset = graphAsset;
        Init();
    }

    private void Init()
    {
        // 让GraphView铺满整个Editor窗口
        this.StretchToParentSize();
        // 开启Graph缩放
        SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
        // 添加拖动Content功能
        this.AddManipulator(new ContentDragger());
        // 添加拖拽选中功能
        this.AddManipulator(new SelectionDragger());
        // 添加框选功能
        this.AddManipulator(new RectangleSelector());

        // 加载uss风格文件
        var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/GraphView/Resources/GraphViewBackGround.uss");
        styleSheets.Add(styleSheet);
        // 添加背景网格
        Insert(0, new GridBackground());
    }
}

1.2.1 uss文件

.uss文件类似于网页上的.css文件,用来设置绘制页面的样式,下面是绘制网格背景的设置。

GridBackground {
    --grid-background-color: #282828;
    --line-color: rgba(193,196,192,0.1);
    --tick-line-color: rgba(193,196,192,0.1);
    --spacing: 20
}

1.2.2缩放功能

SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);

1.2.3框选功能

AddManipulator(new RectangleSelector());

1.2.4拖动视图

AddManipulator(new ContentDragger());

添加点击鼠标中间拖动视图功能。

1.3点击资源文件打开EditorWindow

以往是通过添加 [MenuItem(“name”)] Attribute的方式来打开一个编辑器窗口的,可以通过添加 [OnOpenAsset()] Attribute来通过双击资源的方式调用。

rootVisualElement 描述是窗口层级视图的根视觉元素,将GraphView添加到rootVisualElement.Add(graphView)中才能生效。

using UnityEditor;
using UnityEditor.Callbacks;

public class GraphWindow : EditorWindow
{
    private ScriptGraphAsset m_graphAsset;
    private GraphViewBase graphView;

    [OnOpenAsset()]
    public static bool OnOpenAssets(int instanceId, int line)
    {
        if(EditorUtility.InstanceIDToObject(instanceId) is ScriptGraphAsset graphAsset)
        {
            var window = GetWindow<GraphWindow>();
            window.Open(graphAsset);
        }
        return false;
    }


    private void Open(ScriptGraphAsset graphAsset)
    {
        this.m_graphAsset = graphAsset;
        graphView = new GraphViewBase(graphAsset);
        this.rootVisualElement.Add(graphView);
        Show();
    }
}

最后更新于 2024-01-17