◆ 持续开发中 · 当前为非稳定版本,如需抢先体验请通过 GitHub Issues 联系作者

示例 · 通用属性 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 枚举新增、旧枚举没错位。