枚举配置
把配置表里那些「0=顺序 1=随机 2=离玩家最远」的裸 Int 字段,变成真正的 C# 枚举——编辑器里下拉选择、自动导出枚举类、运行期按枚举名比较,同时 Blob 里仍然是 int,数据结构不变。
命名空间 HYC.Framework.Config(定义)/ HYC.Framework.Config.Editor(生成器)。生成的枚举类命名空间取 ConfigDataSettings.Namespace,落在 ConfigDataSettings.OutputDir/Enums/。
核心类
| 类 | 职责 |
|---|---|
ConfigEnumDefinition | 枚举定义资产(SO),[CfgAsset("枚举/枚举定义", 0, Hide = true)] |
ConfigEnumCodeGen | LoadAllEnums / FindEnum / Validate / GenerateCode / WriteFile / Export / CreateEnumAsset |
ConfigEnumValue | values 列表项:name + description |
入口:数据编辑器里右键 → 枚举定义(ConfigEnumCodeGen.CreateEnumAsset(folder))。
生成产物
using System;
namespace <ConfigDataSettings.Namespace>
{
/// <summary>
/// 装备/部位
/// </summary>
public enum EquipSlot
{
/// <summary>
/// 头部
/// </summary>
Head = 1,
Body = 2,
Weapon = 3,
}
}
数值由框架自动分配,用户只填名字:
// 数值由框架自动分配,用户只填名字
public static long ValueOf(ConfigEnumDefinition def, int index)
=> def != null && def.isFlags ? 1L << index : index + 1L;
坑
- 枚举定义必须先于配置模板生成。模板校验会
FindEnum(enumRefClassName),找不到就报「字段 X 的枚举 Y 不存在」。建表脚本里请把EnsureEnumDefs()放在模板循环之前。 enumRefClassName填的是className不是displayName。displayName支持分类/名称这种带斜杠的写法,不能直接当类名。- 类名不能与配置模板的
className冲突,也不能与其它枚举同名。建议枚举名带语义后缀(WaveSpawnMode、ItemKind)。 - 枚举名 == 字段名是合法的(如字段
OnMaxStacks类型OnMaxStacks),C# 的 Color-Color 规则能正确处理。 - 1 基,没有 0。老数据迁移要
+1;判断「未设置」要用0,不要用某个枚举成员。 - 枚举成员顺序 / 增删 = 破坏性变更:会改变既有数值,已导出的 Blob 会读不出 / 串号,必须重跑配置导出。
- 运行期:Blob 里枚举是
int,需(int)XxxKind.Red比较。