一、GraphView技术基础与应用场景
1. GraphView核心组件
| 组件 | 功能描述 | 关卡编辑应用 |
|---|---|---|
| GraphView | 画布容器 | 关卡拓扑结构编辑区 |
| Node | 基础节点 | 房间/敌人/道具等关卡元素 |
| Edge | 节点连接线 | 路径/依赖关系 |
| Port | 连接端口 | 入口/出口标记 |
| Blackboard | 属性面板 | 元素参数配置 |
| Minimap | 缩略图导航 | 大型关卡导航 |
2. 关卡编辑器核心功能规划
图表
节点创建
连接编辑
属性配置
实时预览
数据序列化
场景生成
二、基础编辑器框架实现
1. 编辑器窗口创建
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine.UIElements;
public class LevelGraphWindow : EditorWindow
{
private LevelGraphView _graphView;
[MenuItem("Tools/Level Graph Editor")]
public static void OpenWindow()
{
var window = GetWindow<LevelGraphWindow>();
window.titleContent = new GUIContent("Level Editor");
}
private void OnEnable()
{
ConstructGraphView();
GenerateToolbar();
}
private void ConstructGraphView()
{
_graphView = new LevelGraphView
{
name = "Level Graph"
};
_graphView.StretchToParentSize();
rootVisualElement.Add(_graphView);
}
private void GenerateToolbar()
{
var toolbar = new Toolbar();
var createRoomBtn = new Button(() => _graphView.CreateRoomNode("Room"))
{
text = "Create Room"
};
toolbar.Add(createRoomBtn);
var saveBtn = new Button(() => SaveGraph())
{
text = "Save"
};
toolbar.Add(saveBtn);
rootVisualElement.Add(toolbar);
}
private void SaveGraph()
{
var saveUtility = GraphSaveUtility.GetInstance(_graphView);
saveUtility.SaveGraph("LevelDesign");
}
}
2. 自定义GraphView
public class LevelGraphView : GraphView
{
public LevelGraphView()
{
// 基础设置
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
this.AddManipulator(new ContentDragger());
this.AddManipulator(new SelectionDragger());
this.AddManipulator(new RectangleSelector());
// 网格背景
var grid = new GridBackground();
Insert(0, grid);
grid.StretchToParentSize();
// 样式设置
var styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Editor/LevelGraph.uss");
styleSheets.Add(styleSheet);
}
public RoomNode CreateRoomNode(string nodeName)
{
var roomNode = new RoomNode(this, nodeName);
AddElement(roomNode);
return roomNode;
}
// 创建节点连接关系
public override List<Port> GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter)
{
var compatiblePorts = new List<Port>();
ports.ForEach(port => {
// 禁止自连接
if (startPort.node == port.node) return;
// 输入只能连输出
if (startPort.direction == port.direction) return;
// 不同类型端口不能连接
if (startPort.portType != port.portType) return;
compatiblePorts.Add(port);
});
return compatiblePorts;
}
}

最低0.47元/天 解锁文章
607

被折叠的 条评论
为什么被折叠?



