天赋树 Talent
可视化编辑天赋树并在运行期查询。节点之间的连线表示前置关系,节点上的「消耗」表示解锁它需要付出多少属性。
命名空间 HYC.Framework.Talent。已实现。
运行期查询
using HYC.Framework.Talent;
[SerializeField] private TalentTreeAsset treeAsset;
var tree = TalentTree.Build(treeAsset);
TalentNode node = tree.GetNode(3);
foreach (var cost in node.costs)
{
// cost.attrKey 去自己的属性系统里查当前值,判断是否够
}
foreach (var pre in tree.PredecessorsOf(node.id))
{
// 检查前置是否已解锁
}
// 可选:运行期自检
var errors = new List<string>();
if (tree.Validate(errors) > 0) { /* ... */ }
生成控制器 + UI 开箱即用
using HYC.Framework.Talent;
// 1) 把生成的控制器(既是状态机又是资源提供器)建出来
var ctrl = new MyTreeTalentController(); // 构造里 Resources = this
// 2) 把 prefab 里的 UI 脚本 Initialize 一下, 它内部会 Build 树 + 绑定状态机
ui.Initialize(ctrl);
// 之后点节点 → TryUnlock → 自动扣点 + 重绘, 全链路开箱即用
核心类
| 类 | 职责 |
|---|---|
TalentTreeAsset | 资产本体 |
TalentTree | 运行期只读视图,Build(asset) 建索引,Validate 自检 |
TalentTreeWindow | 薄壳宿主:只建一个 VisualElement + IMGUIContainer |
TalentGraphIMGUI | 画整个编辑器:工具栏 / 左栏 / 画布 / 右栏 / 底栏 / minimap |
TalentNode | 节点本体,ScriptableObject 子资源;字段 id / title / descLocKey / maxLevel / editorPosition / costs[] |
TalentRuntime | 运行期状态机:IsUnlocked / CanUnlock / TryUnlock + ITalentResourceProvider |
TalentTreeUIBase | UGUI UI 基类:treeAsset + slots + Refresh / ApplySlot / RequestUnlock |
TalentCodeGenerator | 产出 <前缀>TalentController.cs / <前缀>TalentUI.cs / <前缀>TalentTree.prefab |
菜单:HYC Framework/Talent/Talent Tree Editor(pri 50)。
坑
- 图必须无环,编辑器会拦,运行期
Validate也会查。 - 多个入口是合法的,不要指望校验拦你——一棵树可以有好几条并行的起始分支。
- 节点消耗引用的是
attrKey字符串,不是对象引用:改了黑板上的 key,所有引用它的节点消耗会立刻失效。 ConfigRowRef存的是 typeName + id,不持对象引用:配置资产被删除或 id 变了会变成悬空引用;displayName是当时的快照,别用它做逻辑判断。- 消耗按「每级」计,不是「解锁一次性」:
maxLevel=1时两者等价,超过 1 就一定要分清。 - ⚠️ 2.0.6 破坏性变更:
TalentNode由普通[Serializable]类改成子资源后,2.0.6 之前保存的树资产节点读不出来。 - 生成物中
#region GENERATED块重生成会被覆盖,#region USER块原样保留。