Unity基于GraphView的可视化关卡编辑器开发指南

一、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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值