[toc]

# 关卡编辑器需要什么?

  1. 一个和关卡有关的世界根节点
  2. 根节点下的不同子节点 (如动态物体,静态物体,事件点,等), 称之为 元素
  3. 针对不同的 元素 素材库的配置,并支持对素材库的查看和编辑器下的生成
  4. 存储关卡数据时,需要从根节点出发,索引所有的根节点元素,并进行序列化保存,且需要支持多种序列化方式
  5. 支持虚拟的包围盒,方便运行时裁剪

# 实现思路

  1. 先将数据分解为:元素数据库、元素展示器 / 关卡编辑器、关卡序列化器、关卡运行时生成器

元素数据库

数据库内存放各种不同类型的关卡元素

举例: static element: 静态元素

元素展示器 / 关卡编辑器

  1. 提供可以显示当前元素数据库的面板
  2. 提供可以方便实例化选中元素的功能
  3. 提供可以将关卡序列化的序列化器

关卡序列化器

  1. 序列化 / 反序列化
  2. 序列化器类型 (Json / 二进制 / Protobuf)
  3. 需要脱离编辑器而存在,比如在编辑关卡时可以读取序列化后的关卡 / 保存关卡变更,以及可以在运行时对关卡文件进行反序列化

关卡运行时

提供关卡数据的读取与生成实例化的关卡
提供实际的事件等动态模块的运行时支持

关卡元素管理器

提供元素的动态剔除,这一步需要对于每个元素添加一个 AABB 包围盒,然后根据视椎体来进行剔除
如果不想用 Unity 的 GameObject 的话,实际上可以直接通过 Mesh Cluster 和 AABB 以及 SSBO/ComputeShader 直接在 GPU 端完成剔除 / 渲染的操作
管理元素的生成
如果划分区块,也可以根据区块进行元素的剔除

# 效果

资源仓库

关卡编辑器与序列化模式

关卡实例化效果