乐于分享
好东西不私藏

【Unity 技能树插件】SkillTree Architect:快速构建RPG技能树系统

【Unity 技能树插件】SkillTree Architect:快速构建RPG技能树系统

在 RPG、ARPG、策略游戏以及角色养成类游戏中,技能树(Skill Tree)几乎是最常见的成长系统之一。从《暗黑破坏神》的分支技能,到《赛博朋克2077》的多层能力网络,再到各种手游中的天赋系统,技能树承担着玩家成长、属性强化以及玩法引导的重要作用。

然而,在 Unity 中实现一个真正通用的技能树系统并不简单。

一个完整的技能树不仅仅是几个按钮连线,它通常需要包含:

  • 技能节点管理
  • 技能之间的依赖关系
  • 解锁逻辑
  • UI布局
  • 节点状态变化
  • 数据保存
  • 编辑工具
  • 可扩展配置

如果直接通过代码硬编码技能关系,当技能数量增加到几十甚至几百个时,维护成本会迅速提升。

SkillTree Architect 正是针对这一问题设计的一套 Unity 技能树编辑框架,它通过 Editor Window、数据驱动以及模块化布局系统,让开发者可以快速创建复杂技能树。

本文将从 Unity 开发角度分析该插件背后的实现原理。

一、技能树系统的核心设计思想

一个优秀的技能树系统,本质上是一个图结构(Graph)系统

技能节点(Skill Node)是图中的节点:

        Fire Ball           |           |      Fire Mastery        /      \ Ice Shield   Flame Wall

其中:

  • 技能 = Node
  • 技能依赖 = Edge
  • 整个技能树 = Graph

例如:

玩家想学习:

高级火球

必须先拥有:

基础火球

那么两个技能之间存在:

Basic Fireball        |        |Advanced Fireball

这种父子关系。

因此技能树系统的核心实际上是:

使用节点和连接关系描述游戏中的成长逻辑。


二、Skill 数据结构设计

实现技能树首先需要设计技能数据。

通常可以使用 ScriptableObject 保存技能配置。

例如:

[CreateAssetMenu]public class SkillData:ScriptableObject{    public string skillID;    public string skillName;    public Sprite icon;    public int cost;    public SkillState state;    public List<SkillData> children;}

其中:

skillID

技能唯一标识:

例如:

fireball_001

用于:

  • 存档
  • 网络同步
  • 数据查询

skillName

显示名称:

火球术

用于 UI。


icon

技能图标:

对应技能树中的图片。


children

保存子技能:

例如:

火球术 | +---强化火球 | +---火焰爆炸

这样可以形成技能依赖关系。


三、为什么使用 ScriptableObject 保存技能?

Unity 中制作 RPG 系统时,ScriptableObject 是非常适合的数据容器。

相比 MonoBehaviour:

MonoBehaviour:

Skill | GameObject | Scene

依赖场景。

而 ScriptableObject:

SkillData.asset

独立存在。

优点:

1. 数据和逻辑分离

技能数据:

Fireball.asset

技能表现:

SkillUI.cs

技能执行:

SkillManager.cs

互相独立。


2. 支持大量技能

例如:

1000个技能:

Skill_001.assetSkill_002.assetSkill_003.asset...

不会污染场景。


3. 支持版本管理

策划修改技能:

增加:

  • 名称
  • 图标
  • 消耗
  • 描述

不需要修改代码。


四、Editor Window 技能树编辑器实现

SkillTree Architect 最大特点之一:

提供可视化编辑窗口。

类似 Unity Animator:

+----------------+| Skill Node     ||                || Fire Ball      || Cost:10        |+----------------+        |        |+----------------+| Skill Node     || Fire Mastery   |+----------------+

开发者可以拖动节点、连接节点。


EditorWindow实现

Unity编辑器扩展:

public class SkillTreeWindow:EditorWindow{    [MenuItem("Tools/Skill Tree")]    static void Open()    {        GetWindow<SkillTreeWindow>();    }    private void OnGUI()    {    }}

创建:

Tools | Skill Tree

菜单入口。


五、节点绘制原理

Unity Editor GUI 提供:

GUIEditorGUIHandles

用于绘制编辑器。

技能节点通常使用:

GUI.Box()

绘制。

例如:

GUI.Box(nodeRect,skillName);

得到:

+------------+| Fire Ball |+------------+

节点位置保存:

public Rect rect;

例如:

Rect(100,200,150,80);

表示:

X =100Y=200Width=150Height=80

六、技能连接线实现原理

技能树最关键部分:

节点连接。

Unity Editor 中:

通常使用:

Handles.DrawBezier()

绘制曲线。

例如:

Handles.DrawBezier(start,end,startTan,endTan,Color.white,null,2);

效果:

Skill A   \    \     \      Skill B

连接数据:

一般保存:

class SkillConnection{    public SkillNode parent;    public SkillNode child;}

例如:

FireBall | |FireMaster

保存:

parent = FireBallchild = FireMaster

七、模块化 Layout System 实现

不同游戏技能树布局不同:

例如:

RPG

       A      / \     B   C    /   D

天赋盘

      A  B       C      D

线性升级

A|B|C

因此插件设计了:

Modular Layout System

核心思想:

布局算法和技能数据分离。


例如:

定义:

interface ISkillLayout{    void Arrange(        List<Node> nodes    );}

然后实现:


Vertical Layout

垂直布局:

class VerticalLayout{    public void Arrange()    {    }}

结果:

A|B|C

Radial Layout

圆形布局:

数学公式:

x = centerX + cos(angle)*radiusy = centerY + sin(angle)*radius

效果:

       A B             C       D

这样:

新增布局:

不用修改技能系统。


八、技能状态系统设计

技能通常有三个状态:

LockedUnlockableUnlocked

例如:

未满足条件:

🔒 火焰强化

满足:

⭐ 火焰强化

学习:

🔥 火焰强化

代码:

public enum SkillState{    Locked,    Unlockable,    Unlocked}

状态转换:

Locked |满足条件 |Unlockable |消耗技能点 |Unlocked

九、技能解锁逻辑

核心:

检测父节点。

例如:

学习:

高级火球

检查:

基础火球 是否学习

代码:

bool CanUnlock(Skill skill){    foreach(var parent in skill.parents)    {        if(parent.state != SkillState.Unlocked)            returnfalse;    }    return true;}

如果满足:

修改状态:

skill.state =SkillState.Unlocked;

十、UI运行时显示实现

编辑器负责:

创建技能树

运行时负责:

显示技能树

通常结构:

SkillTreeManager       |SkillTreeUI       |SkillNodeUI       |Button

SkillNodeUI:

public class SkillNodeUI:MonoBehaviour{    public Image icon;    public Button button;}

点击:

button.onClick.AddListener(    UnlockSkill);

十一、连接线UI实现

运行时技能树:

通常使用:

LineRenderer

例如:

LineRenderer line;

连接:

NodeA |NodeB

或者:

使用:

UI Image+旋转+缩放

生成连接线。

计算:

两个节点位置:

Vector2 dir =end-start;

长度:

distance =dir.magnitude;

旋转:

angle=atan2(y,x)

生成:

一条图片线

十二、无限技能树设计

插件支持:

Unlimited Skill Trees。

实现方式:

SkillTree 数据:

class SkillTreeData{    string treeName;    List<SkillNode> nodes;}

例如:

角色:

Warrior TreeMage TreeArcher Tree

每个:

独立保存。


十三、存档系统设计

技能状态不能只存在内存。

需要保存:

例如:

{    "skills":    [        {            "id":"fireball",            "state":2        }    ]}

加载:

SkillID查找SkillData恢复状态

十四、性能优化考虑

大型技能树可能:

几百节点。

需要注意:

1. UI对象池

不要:

CreateDestroyCreateDestroy

使用:

Object Pool

2. Canvas优化

技能节点:

避免:

大量Canvas。

推荐:

一个Canvas:

SkillTreeCanvas    |    | Skill Nodes

3. 数据缓存

不要每次点击:

遍历全部技能。

建立:

Dictionary:

Dictionary<string,SkillData>

快速查询。


十五、插件适合的游戏类型

SkillTree Architect 适用于:

RPG

例如:

职业技能:

战士 |剑术 |狂暴

ARPG

例如:

装备流派:

冰系火系毒系

卡牌游戏

例如:

卡牌升级路线。


Roguelike

随机技能选择。


总结

SkillTree Architect 的核心价值并不是简单提供几个 UI 节点,而是提供了一套完整的:

  • 数据驱动技能系统
  • Editor可视化编辑
  • 节点图结构管理
  • 模块化布局算法
  • 状态管理机制
  • 运行时UI展示框架

从技术实现角度来看,它本质上类似 Unity Animator、Shader Graph 这类节点编辑工具:

通过 Graph 数据结构描述关系,通过 Editor Window 创建内容,通过 Runtime 系统执行逻辑。

如果开发一款 RPG、ARPG 或养成类游戏,一个成熟的技能树编辑框架能够极大降低后期维护成本,让策划可以独立调整技能结构,而无需频繁修改代码。

对于 Unity 开发者而言,SkillTree Architect 不仅是一套技能树插件,更是学习 Unity Editor扩展、Graph系统设计、数据驱动架构 的一个非常好的案例。

资源获取方式:扫描下方二维码或者直接搜索微信号 hanglimath