Overview
The Progression Tree Builder system consists of the following main components:
- Progression Tree — Scriptable Object containing all skills
- Progression Skill — Scriptable Object defining individual skills
- Tree Manager — MonoBehaviour managing runtime state
- Skill Instruction Manager — MonoBehaviour coordinating scene-based instructions
- Skill Instructions — MonoBehaviour for per-skill scene-specific behavior
- UI Controller — MonoBehaviour coordinating the display
- Skill Node Renderer — Sub-controller for node creation and positioning
- Connection Renderer — Sub-controller for visual connection lines
- Tree Navigation Controller — Sub-controller for multi-tree navigation
- Latest Mode Layout Controller — Specialized controller for roguelike progression
- Latest Mode Detail Panel — Individual skill panel in Latest mode
- IProgressionTreeReference — Interface for flexible tree references
- ProgressionTreeReference — Wrapper class for tree asset references
Progression Tree
Scriptable ObjectThe main object that defines a complete skill tree.
Create via:
Create → Game Creator → Progression Tree Builder → Progression TreeProperties
| Property | Type | Description |
|---|---|---|
| Tree Name | string | Name of the tree displayed in the UI |
| Description | string | Description of the tree |
| Skills | List<ProgressionSkill> | All skills in this tree |
| Root Skills | List<ProgressionSkill> | Skills without prerequisites |
| Allow Respec | bool | Can skills be reset? |
| Layout Type | enum | Vertical, Horizontal, Radial, or Free-form |
| Choice Groups | List<ChoiceGroup> | Groups where only one skill can be chosen |
Progression Skill
Scriptable ObjectDefines a single skill or ability.
Create via:
Create → Game Creator → Progression Tree Builder → Progression SkillProperties
| Property | Type | Description |
|---|---|---|
| Skill Name | string | Display name of the skill |
| Description | string | What does this skill do? |
| Icon | Sprite | Icon for the UI |
| Skill Type | enum | Passive, Active, or Choice |
| Max Rank | int | Maximum level (1 = not upgradeable) |
| Base Skill Point Cost | int | Cost to unlock |
| Selection Weight | int | Weight for Latest mode (1-100, higher = more common) |
| Required Skills | List<ProgressionSkill> | Skills that must be unlocked first |
| Stat Modifiers | List<SkillStatModifier> | Stats that are modified |
Progression Tree Manager
MonoBehaviourManages the runtime state of all Progression Trees.
Properties
| Property | Type | Description |
|---|---|---|
| Target Character | GameObject | GameObject with Traits component |
| Available Trees | List<TreeConfig> | List of all available trees |
| Auto Unlock Trees | bool | Unlock all trees automatically? |
| Use Separate Points | bool | Each tree has its own points vs. global |
Methods
UnlockSkill(tree, skill) → bool
UpgradeSkill(tree, skill) → bool
GetSkillRank(tree, skill) → int
IsSkillUnlocked(tree, skill) → bool
GetAvailablePoints(tree) → int
RefreshLatestPool(tree, count) → void
GetCurrentLatestPool(tree) → List<ProgressionSkill>
RespecTree(tree) → boolSkill Instruction Manager
MonoBehaviourCentral manager for all scene-based skill instructions. Automatically finds and executes SkillInstructions components when skills are triggered. Add this component to your ProgressionTreeManager GameObject.
Properties
| Property | Type | Description |
|---|---|---|
| Auto Find On Awake | bool | Automatically find all SkillInstructions in scene on start |
| Search Children Only | bool | Limit search to children only (false = search entire scene) |
| Debug Mode | bool | Log when instructions are executed for debugging |
| Registered Skills | List<SkillInstructions> | All found SkillInstructions components (read-only) |
Methods
FindAllSkillInstructions() → void
GetSkillInstructions(skillId) → SkillInstructions
HasInstructions(skillId) → bool
ExecuteOnUnlocked(skillId, args) → void
ExecuteOnActivated(skillId, args) → void
ExecuteOnUpgrade(skillId, args) → void
RegisterSkill(skill) → voidSkill Instructions
MonoBehaviourScene-based instruction component that executes Game Creator Instructions for a specific skill. Supports GameObject drag & drop references and scene-specific behavior. Each skill can have multiple SkillInstructions components across different scenes.
Properties
| Property | Type | Description |
|---|---|---|
| Skill | ProgressionSkill | The skill this component controls (required) |
| Use On Unlocked | bool | Execute instructions when skill is unlocked |
| On Unlocked | InstructionList | Instructions to run when unlocked |
| Use On Activated | bool | Execute instructions when skill is activated |
| On Activated | InstructionList | Instructions to run when activated |
| Use On Upgrade | bool | Execute instructions when skill ranks up |
| On Upgrade | InstructionList | Instructions to run on upgrade |
Methods
GetSkillID() → string
GetSkillName() → string
GetSkill() → ProgressionSkill
ExecuteOnUnlocked(args) → Task
ExecuteOnActivated(args) → Task
ExecuteOnUpgrade(args) → Task
HasAnyInstructions() → bool
HasSkillAssigned() → boolProgression Tree UI Controller
MonoBehaviourControls the entire UI display and user interaction.
Properties
| Property | Type | Description |
|---|---|---|
| Layout Mode | enum | Grid, Graph, List, or Latest |
| Grid Columns | int | Number of columns in Grid mode |
| Details Panel Alignment | enum | Position of the details popup |
| Latest Node Count | int | How many skills to show in Latest mode (2-6) |
| Latest Column Spacing | float | Space between panels in Latest mode |
| Auto Refresh On All Maxed | bool | Refresh pool when all skills are maxed |
| Column Width | float | Fixed width per column (0 = auto-fit) |
| Padding | float | Distance to screen edges |
Methods
OpenTree(tree) → void
CloseTree() → void
SwitchToTree(tree) → void
SelectSkill(skill) → void
RefreshUI() → voidLatest Mode Layout Controller
MonoBehaviourSpecialized controller for roguelike-style Latest mode with N detail panels side-by-side.
Properties
| Property | Type | Description |
|---|---|---|
| Details Container | RectTransform | Container for horizontal layout |
| Details Panel Prefab | GameObject | Prefab with ProgressionDetailsUI component |
| Column Spacing | float | Space between panels |
| Column Width | float | Width per panel (0 = auto-fit) |
Methods
Initialize() → void
DisplayLatestPool(tree, skills) → void
RefreshDisplay() → void
AreAllNodesMaxed() → bool
ClearPanels() → voidLatest Mode Detail Panel
MonoBehaviourWrapper component for individual skill detail panels in Latest mode. Each panel shows full skill information and has its own unlock/upgrade button.
Properties
| Property | Type | Description |
|---|---|---|
| Current Skill | ProgressionSkill | The skill displayed in this panel (read-only) |
Methods
Initialize(tree, skill) → void
RefreshDisplay() → voidLayout Modes
Grid
Fixed grid layout with configurable columns
Best for: Traditional skill trees
Graph
Free-form positioning based on tree's layout type
Best for: Complex dependency visualization
List
Vertical list layout
Best for: Simple linear progression
Latest
Roguelike mode showing N random skills from pool
Best for: Roguelike/roguelite games, survivors-style
Latest Mode: See the Usage Guide for detailed setup instructions and examples.
Skill Types
Passive
Applied permanently. Effects are always active.
Example: +10 Health
Active
Must be activated manually. Use On Unlock Actions.
Example: Fireball Spell
Choice
Part of a Choice Group - only one can be chosen.
Example: Warrior vs Mage
Stat Modifier Types
| Type | Example | Description |
|---|---|---|
| Flat | +10 Health | Fixed value is added |
| Percentage | +15% Damage | Percentage bonus |
| Per Rank | +5 per Rank | Scales with skill rank |
Code Examples
Unlock Skill Programmatically
// Get reference to Manager
var manager = ProgressionTreeManager.Instance;
// Unlock skill
bool success = manager.UnlockSkill(myTree, mySkill);
if (success)
{
Debug.Log("Skill unlocked!");
}Refresh Latest Pool
// Refresh pool with 3 new skills
manager.RefreshLatestPool(myTree, 3);
// Get current pool
var currentPool = manager.GetCurrentLatestPool(myTree);
Debug.Log($"Pool size: {currentPool.Count}");Listen to Skill Events
// Subscribe to unlock events
manager.OnSkillUnlocked.AddListener((tree, skill) =>
{
Debug.Log($"Unlocked: {skill.skillName}");
});
// Subscribe to upgrade events
manager.OnSkillUpgraded.AddListener((tree, skill, newRank) =>
{
Debug.Log($"{skill.skillName} now rank {newRank}");
});