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

天赋树 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
TalentTreeUIBaseUGUI 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 块原样保留。