[toc]
# 关卡编辑器需要什么?
- 一个和关卡有关的世界根节点
- 根节点下的不同子节点 (如动态物体,静态物体,事件点,等), 称之为
元素
- 针对不同的
元素
素材库的配置,并支持对素材库的查看和编辑器下的生成 - 存储关卡数据时,需要从根节点出发,索引所有的根节点元素,并进行序列化保存,且需要支持多种序列化方式
- 支持虚拟的包围盒,方便运行时裁剪
# 实现思路
- 先将数据分解为:元素数据库、元素展示器 / 关卡编辑器、关卡序列化器、关卡运行时生成器
元素数据库
数据库内存放各种不同类型的关卡元素
举例: static element: 静态元素
元素展示器 / 关卡编辑器
- 提供可以显示当前元素数据库的面板
- 提供可以方便实例化选中元素的功能
- 提供可以将关卡序列化的序列化器
关卡序列化器
- 序列化 / 反序列化
- 序列化器类型 (Json / 二进制 / Protobuf)
- 需要脱离编辑器而存在,比如在编辑关卡时可以读取序列化后的关卡 / 保存关卡变更,以及可以在运行时对关卡文件进行反序列化
关卡运行时
提供关卡数据的读取与生成实例化的关卡
提供实际的事件等动态模块的运行时支持关卡元素管理器
提供元素的动态剔除,这一步需要对于每个元素添加一个 AABB 包围盒,然后根据视椎体来进行剔除
如果不想用 Unity 的 GameObject 的话,实际上可以直接通过 Mesh Cluster 和 AABB 以及 SSBO/ComputeShader 直接在 GPU 端完成剔除 / 渲染的操作
管理元素的生成
如果划分区块,也可以根据区块进行元素的剔除
# 效果
资源仓库
关卡编辑器与序列化模式
关卡实例化效果