14 KiB
玩法编辑器使用手册
1. 设计目的
优化版本并行开发效率,缩短特殊玩法需求频繁迭代功能的开发周期。
2. 工作流
对应负责人开启活动需求统筹表 → 下游各组资产制作完成后 → 根据需求统筹表描述放到对应路径提交上传 → 策划通过玩法编辑器进行配置好索引表并上传 → 在引擎内使用导入工具检查资源。
3. 配置说明
活动玩法会涉及到场景资源、镜头资源、UI资源、特效资源。所有资源会配表做静态字典映射,在开启活动模块时根据映射加载对应资源。行为树逻辑编辑器在节点引用时会从对应字典内进行查找引用。
3.1 行为树配置表(自定义 name)
工作表1:玩法关卡配置表
用来索引玩法场景的逻辑 ID、场景资源、地图坐标打点 list、默认主相机。
| Doc | 行为树ID | 关卡备注 | 场景名称 | 地图打点组 | 是否关闭加载画面 | 默认相机ID |
|---|---|---|---|---|---|---|
| Name | ActivityStageID | Doc | SceneName | MapInfo | CloseLoadingDelaySeconds | CameraID |
| Type | Int | String | String | ID | Float | Int |
打开:功能编辑器
工作表2:行为树逻辑表
配置行为树头文件和行为树逻辑本身。
| 列名 | 说明 |
|---|---|
| 行为树ID | 全局唯一标识(如 301502490) |
| 说明(注释) | 行为树文件说明 |
| 节点 | 各级子节点名称(可展开多列) |
| 行索引ID | 行为节点在行为树中的引用 ID |
节点层级结构说明(树形):
行为树ID: 301502490 (行为树文件 平行)
├── 组合 方法:关卡通用关卡赋值
├── 组合 方法:关卡初始化
└── 后面是你自己的逻辑
行为树ID: 30150249 (行为树逻辑正文 顺序)
├── 组合 方法:关卡预准备
├── 平行
│ └── 组合 方法:关卡通用集合
└── 后面是你自己的逻辑
行为树关键说明:
- 【关卡ID+0】 为头文件,里面的逻辑只执行一次,用来声明初始数据或执行一些初始化逻辑。
- 【关卡ID】 后开始是行为树正文,主要写正式逻辑,默认1秒运行60次(根据性能需求可调整到1秒20次)。
- 【行索引】 会在当前行有子功能节点时打表自动生成,方便报错时定位行数。
- 【组合方法】 封装函数或子树,类似行为树的子树结构一处理一些通用赋值,比如开场是否隐藏UI、是否播放某个入场动画、对多个字典进行赋值等等。
- 行为树默认包含四个基础执行节点:
- 平行:执行该节点下的所有子节点并返回true,无论子节点是否执行成功。
- 顺序:该节点下一旦有子节点返回false则停止执行返回false,子节点全部返回true该节点才返回true。
- 选择:该节点下一旦有子节点返回true则停止执行返回true,子节点全部返回false该节点才返回false。
- 乱选:随机执行一个子节点,结果为true则返回true,结果false返回false。
- 需要一个组合方法在头文件里分别在黑板里创建1#(当前行为树域)、2#(角色域)、3#(自定义域)、4#(系统全局域)、UI、相机、特效、演出配置的映射字典(或者是外部Data管理,功能节点默认找对应字典)。
工作表3:行为树节点查询与说明(注释用)
| 节点类型 | 描述 | 中文节点映射 | 参数1 | 参数2 | 参数3 | 参数4 | 参数5 |
|---|---|---|---|---|---|---|---|
| DoGetTime | 参数1(帧数)= 当前关卡时间(帧数)+ 参数2(秒转帧数) | int赋值时间 | int 帧数存值 | fix 时间单位秒 | |||
| CheckNpcCamp | 比较阵营是否相等或包含参数1NPC参数2阵营(包含、相交、相等都是队友) | 比较阵营 | int 自定义 | int 自定义 | |||
| DoSetFightTarget | 设置Npc1(参数1)的攻击目标为Npc2(参数2) | 设置战斗目标 | int Npc1 | int Npc2的Id |
工作表4:组合节点说明(同工作表3)
| 组合树ID | 组合树类型 | 注释 |
|---|---|---|
| String | 节点名称 | |
| 200009 | 万法:关卡初始化 | |
| 200010 | 万法:关卡预准备 |
3.2 ActivityUiLut
UI 资源。填写需要使用的关卡和映射 ID,可以填 String。
| 关卡ID | UI映射ID | Prefab路径 |
|---|---|---|
| int | int | path |
3.3 ActivityCameraLut
相机资源,配置同上。
| 关卡ID | Cam映射ID | Prefab路径 |
|---|---|---|
| int | int | path |
3.4 ActivityFXLut
特效资源,配置同上。
| 关卡ID | FX映射ID | Prefab路径 |
|---|---|---|
| int | int | path |
3.5 ActivityMapInfoLut
地图打点存储表,需要对应的地图点位编辑器。
| infoID | 点位ID | 坐标 | 点位ID | 坐标 | 点位ID | 坐标 | 点位ID | 坐标 |
|---|---|---|---|---|---|---|---|---|
| int | String | Vector3 | String | Vector3 | String | Vector3 | String | Vector3 |
3.6 ActivityDialogInfoByStage
活动文本 UI 配置索引表。文本配置 ID 就是下面 DialogInfo 配置表的 name。
| 玩法关卡ID | 对应文本配置表 |
|---|---|
| int | String |
3.7 DialogInfo + 自定义序号
具体文本配置(与行为树一样,每个策划一张自己的 dialoginfo,需要先跟本地化管线讨论)。
| id | isMask | MaskTarget | ClickKey | DialogType | UIType | PrefabPath | Name | Text | Duration | Params1 | Params2 | Params3 | Params4 | Params5 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 配置ID | 是否开启蒙层 | 蒙层位置(万分比屏幕坐标) | 关闭蒙层键值 | 战中类型 | UI样式(变同类型战中样式) | UI预制体路径(默认不填写) | 显示角色名 | 正文(支持富文本) | 显示时间 | 特殊参数1 | 特殊参数2 | 特殊参数3 | 特殊参数4 | 特殊参数5 |
| int | bool | 万分比屏幕坐标 | int | int | int | String | 对话正文 | float |
行为树对应功能节点:
| 节点名称 | 参数1 |
|---|---|
| DoShowDialog | DialogInfoID |
| int | int |
4. QA & Debug
- 上传对应行为树前需要策划自检,流程是否可以整跑通,过程中是否有节点报错,根据对应报错 ID 进行 Debug。
- 资源检查:需要策划导入时自行检查资源是否与需求对应,是否在导入时出现失索引。
- 提测 QA 后,QA 如发现流程卡死或报错,需要先向策划负责人提单,策划检查判断确定是非配置问题,再向其他对应下游提出修改需求。
5. 玩法编辑器工具操作指南
5.1 文件结构
Assets/BP_Scripts/GameplayEditor/
├── Core/
│ ├── GameplayGraph.cs ← 自定义 Graph 类型(Asset 本体)
│ ├── GameplayNode.cs ← 节点数据模型(含9个业务字段)
│ └── GameplayConnection.cs ← 节点连线类型
├── Export/
│ ├── ExcelExporter.cs ← Canvas → CSV 导出逻辑
│ └── ExcelImporter.cs ← CSV → Canvas 导入逻辑
├── GameplayEditorWindow.cs ← 编辑器窗口 UI
├── GraphDataSchema.cs ← 字段映射配置(ScriptableObject)
├── GraphExcelSyncManager.cs ← 运行时同步组件
└── ExcelDataProvider.cs ← CSV 读写基础工具
5.2 快速开始
第一步:创建 GameplayGraph Asset
在 Project 窗口中右键 → Create → NodeCanvas → Gameplay Graph,命名为关卡名,例如 Level01Graph。
第二步:创建 GraphDataSchema 配置
右键 → Create → GameplayEditor → GraphDataSchema,命名为 Level01Schema,在 Inspector 中可查看字段映射关系(用于编辑器窗口右侧展示)。
第三步:打开玩法编辑器窗口
菜单栏 → Window → Gameplay Editor
┌──────────────────────────────────────────────────────────────┐
│ [Graph 拖槽] [Schema 拖槽] [导出 Canvas→CSV] [导入 CSV→Canvas] │ ← 工具栏
├─────────────────────┬────────────────────────────────────────┤
│ Canvas 可视化编辑 │ CSV 字段映射 │
│ 显示所有节点列表 │ 显示 Schema 中配置的字段映射关系 │
└─────────────────────┴────────────────────────────────────────┘
将 Level01Graph 和 Level01Schema 分别拖入工具栏对应拖槽。
第四步:在 Canvas 中编辑节点
双击 Level01Graph.asset 打开 NodeCanvas 编辑器,右键画布 → Add Node → GameplayEditor → GameplayNode 添加节点。
点击节点在 Inspector 中编辑以下字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
| Level ID | int | 关卡编号 ID(对应 ActivityStageID) |
| Node ID | int | 节点唯一 ID(同一 Graph 内不能重复) |
| Node Layer | int | 节点层级(0 为顶层根节点) |
| Event Type Group | string | 事件类型组,多个用 | 分隔,如 1|2|3 |
| Priority | string | 优先级权重,多个用 | 分隔,如 10|20 |
| Event Mapping ID | int | 事件 ID 映射值(对应各 Lut 表中的映射 ID) |
| Interact Visible | bool | 交互时是否显示该节点 |
| Node State | bool | 节点是否处于可进入状态 |
| Parent Node ID | int | 父节点的 Node ID,-1 表示根节点(无父节点) |
拖拽节点端口建立连线,连线关系在导入时会根据 ParentNodeID 字段自动重建。
第五步:导出 Canvas → CSV
工具栏点击 "导出 Canvas → CSV",输出到 Assets/玩法编辑器.csv。
生成格式(行1=字段名,行2=类型,行3=说明,行4起=节点数据):
LevelID,NodeID,NodeLayer,EventTypeGroup,Priority,EventMappingID,InteractVisible,NodeState,ParentNodeID
int,int,int,string,string,int,bool,bool,int
关卡编号ID,节点ID(唯一),节点层级,节点事件类型组(|分隔),优先级权重(|分隔),存储事件ID映射,交互是否可见,节点是否可进入,父节点ID(-1表示无父节点)
1,101,0,1|2,10|20,5001,True,True,-1
1,102,1,3,30,5002,True,True,101
生成的
.csv可直接用 Excel 打开(打开时选 UTF-8 编码)。
第六步:批量编辑后导入 CSV → Canvas
- 用 Excel 修改
Assets/玩法编辑器.csv(不要删除前3行表头) - 保存文件
- 回到 Unity,点击 "导入 CSV → Canvas"
注意:导入会清空当前 Canvas 中的所有节点后重建。 导入后自动根据
ParentNodeID重建连线,-1表示根节点不连线。
5.3 嵌套节点示例
CSV 数据:
LevelID,NodeID,NodeLayer,...,ParentNodeID
int,int,int,...,int
(doc行)
1,100,0,...,-1
1,101,1,...,100
1,102,1,...,100
1,103,2,...,101
Canvas 连线结构:
[NodeID:100](根节点,ParentNodeID=-1)
├── [NodeID:101](ParentNodeID=100)
│ └── [NodeID:103](ParentNodeID=101)
└── [NodeID:102](ParentNodeID=100)
5.4 运行时自动同步(可选)
如需在运行时自动同步,将 GraphExcelSyncManager 组件挂到场景中的 GameObject 上:
- Add Component → GraphExcelSyncManager
- Inspector 中绑定
Target Graph和Schema
之后每次 Graph 触发序列化事件时会自动写入 CSV。
6. 常见问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 导入后节点全部重叠 | 导入时节点默认位置为 Vector2.zero | 在 Canvas 中手动排布节点位置 |
| CSV 用 Excel 打开乱码 | 编码不一致 | Excel → 数据 → 从文本/CSV 导入 → 选 UTF-8 |
| 导入报错 "CSV file format invalid" | 缺少前3行表头 | 保留 NAME/TYPE/DOC 三行,数据从第4行开始 |
| 点击导出提示"请选择 Graph 和 Schema" | 工具栏拖槽为空 | Graph 和 Schema 两个拖槽都需要赋值 |
| Create 菜单找不到 Gameplay Graph | 正常,菜单已注册 | 右键 → Create → NodeCanvas → Gameplay Graph |
| QA 发现流程卡死 | 可能是配置问题也可能是程序问题 | 先策划自检行为树节点报错,确认非配置问题再提程序单 |