示例 · 通用属性 Attr
加载真实 GameHeroSet.asset → InitFromSet 灌袋 → 用生成出来的 GameAttrBag 做类型安全读写,零手写 key 字符串。
文件:GameAttrKey.cs / GameAttrKeyMap.cs / GameAttrBag.cs / HYCSimpleAttrDemoSystem.cs
心智模型
AttributeCatalog(SO):属性的「单一真源」清单。每个条目 =key+type(Int/Float/Long/Bool) +defaultRaw/minRaw/maxRaw。AttributeSetAsset(SO):给某类实体从目录里挑一篮子属性的预设,保存时烘成List<AttributeValue>。- 生成访问器(向导):把目录生成
GameAttrKey(enum) +GameAttrKeyMap(Hash/Type) +GameAttrBag(类型安全读写)。 - 运行时:实体挂
AttributeSetRef→AttributeInitSystem进 Play 自动把 values 灌进DynamicBuffer<AttributeValue>→ 玩法用GameAttrBag读写。
端到端步骤
1. 建目录资产 Project 右键 HYC Framework/Attributes/Attribute Catalog,加条目
2. (可选)建属性组 HYC Framework/Attributes/Attribute Set,绑定 catalog,勾选要哪些属性
3. 生成访问器 Catalog 编辑器点「生成属性访问器」→ Assets/HYC/Generated/Attr/(默认前缀 Game)
4. 实体挂引用 实体加 AttributeSetRef { asset = 你的Set } → AttributeInitSystem 自动灌值
(或手动 AttributeInitializer.InitFromSet(em, e, set))
5. 玩法读写 var bag = new GameAttrBag(em, e); int hp = bag.GetInt(GameAttrKey.HP);
关键代码
// em, e 来自你的 World
var bag = new GameAttrBag(em, e);
int atk = bag.GetInt(GameAttrKey.ATK); // IntelliSense + 拼错编译期报错
bag.SetInt(GameAttrKey.ATK, atk + 5);
Attribute Catalog Editor 窗口(两页)
菜单 HYC Framework/Attributes/Attribute Catalog Editor 打开,自动绑定选中 / 工程内首个 Catalog。
- 页 1 · 属性目录:类型感知表格。Float 显示小数(raw 内部走 IEEE754 bits,自动往返);Bool 只显示勾选框,隐藏 min/max;Int/Long 显示整数;行首
≡拖拽重排、行尾✕删除、底部「+ 添加属性」。 - 页 2 · 属性组:左列工程内全部组资产,右列从当前目录勾选 key,勾选变化即时
Rebuild()烘焙 values。
给 AI 的雷区
- Float 存 bits:
AttributeValue.raw对 Float 是BitConverter.DoubleToInt64Bits/Int64BitsToDouble。手写 raw 必须走这套转换;NaN/Inf 会被AttributeValidator拦下。 - 枚举是目录的快照:目录增删 / 改顺序后必须重新 Generate,否则枚举与运行时袋数据序数错位。keyHash 按名算,同 key 改名不影响旧袋。
- 运行期
Set不钳制:配置边界只约束默认值;InitFromSet灌值时按[Min,Max]钳制,之后Set是运行时真相,不自动 clamp。 - keyHash 命中失败是静默的:
Get返回调用方默认值、Set为 no-op。读到 0 先确认实体确实AddBuffer<AttributeValue>且 key 在袋内。 AttributeSetRef是托管IComponentData(class):不走 Burst/Job,适合低频初始化,不进逐帧热路径。AttributeCatalog/AttributeSetAsset是 Runtime ScriptableObject:打包即用,无需像 BT 那样导出 Blob。
这个示例怎么走真实资产
HYCSimpleAttrDemoSystem 优先走真实资产链路:首次 Update 用 AssetDatabase.LoadAssetAtPath<AttributeSetAsset> 读 Assets/HYCSimpleSampleAssets/GameHeroSet.asset,命中后调 AttributeInitializer.InitFromSet(em, e, set) 灌袋。资产由菜单 HYC Framework/Samples/Attr/创建示例属性资产 生成。
◈
回退:若资产还没生成(没跑过菜单),系统会
Debug.LogWarning 并退回手写 buffer,保证「不跑菜单也能编译运行」。但这只是兜底——示例的主路径就是真实 .asset。验证清单
- 进 Play,Console 打印
[HYCSimple] 属性演示:HP=110 ...(SetInt 后 HP+10)。 - 目录加一个属性后重新 Generate,确认
GameAttrKey枚举新增、旧枚举没错位。