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 API的 UnityEditor.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();
}
}
Comments NOTHING