Tech Tree & Research
Overview
Manages a dependency graph of technologies/upgrades. Uses ScriptableObjects to define Nodes (Techs) and their Parents (Prerequisites).
When to Use
- •Use for Civ-like tech trees
- •Use for RPG Skill Trees
- •Use for unlocking buildings/units in RTS
- •Use for persistent meta-progression
- •Use for dependency validation
Architecture
code
┌─────────────────────────────────────────────────────────────┐
│ RESEARCH GRAPH │
├─────────────────────────────────────────────────────────────┤
│ │
│ TECH NODE (SO) RESEARCH MANAGER │
│ ┌────────────────┐ ┌───────────────────────────┐ │
│ │ Name: "Iron" │ │ Unlocked: {Pottery, Iron} │ │
│ │ Cost: 50 Sci │ │ │ │
│ │ Parents: [Pot] │──────▶ IsUnlocked(Nodes) │ │
│ └────────────────┘ │ CanResearch(Node) │ │
│ └─────────────┬─────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────┐ │
│ │ EVENT: OnTechUnlocked │ │
│ └───────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Best Practices
- •✅ Recursively check parents for
IsResearchable(). - •✅ Store
Visualdata (Icon, Description) in the Node SO. - •✅ Store
State(Unlocked/Available) in the Manager (Runtime). - •✅ Use IDs or Object References for saving/loading.
- •❌ NEVER create cyclic dependencies (A requires B, B requires A). Editor Tools should validate this.
- •❌ NEVER hardcode tech trees in C# classes.
Few-Shot Examples
Example 1: Tech Node Data
User: "Create a tech node."
Agent:
csharp
[CreateAssetMenu]
public class TechNode : ScriptableObject
{
public string ID;
public List<TechNode> Prerequisites;
public int ResearchCost;
}
Example 2: Validation Logic
User: "Check if I can research Steel."
Agent:
csharp
public bool CanResearch(TechNode node)
{
if (IsUnlocked(node)) return false;
// All parents must be unlocked
foreach (var parent in node.Prerequisites)
{
if (!IsUnlocked(parent)) return false;
}
return true;
}
Related Skills
- •
@resource-management-system- Paying research costs - •
@save-load-serialization- Saving unlocked tech