Quick Start
By the end of this page you'll have a skill tree asset, a manager that owns its runtime state on the Player State, and a node you can activate from code - replicated to clients.
CrimsonCommon and CrimsonSkillTree are installed. Your Player State already has (or will get) a Gameplay Ability System Component if you want GAS-driven conditions/events.1. Enable the plugin
Open Edit -> Plugins, type Crimson in the search box, tick CrimsonSkillTree's checkbox (and CrimsonCommon, its dependency), and restart the editor when prompted. For a Blueprint project that's the entire install - you never hand-edit the .uproject or any .Build.cs.
.uproject or .Build.cs to edit. The editor writes the plugin entry for you. The C++ step below is needed only when you reference CrimsonSkillTree types from your own C++ code.C++ projects: after enabling the plugin above, add its module to your build file so your game code can use its types:
// YourGame.Build.csPublicDependencyModuleNames.Add("CrimsonSkillTree");
2. Add the manager and implement the host interface
UCrimsonSkillTreeManager holds the runtime state. Put it on the Player State so it replicates with the player and survives pawn respawns.
Now make the host actor itself implement `ICrimsonSkillTreeInterface`. The manager calls this interface on the actor that owns it to resolve the logical owner of the tree's effects (usually the controlled Pawn). Implement all three methods.
Images/CrimsonSkillTree/qs-implement-interface.pngICrimsonSkillTreeInterface::Execute_GetSkillTreeOwner(GetOwner()) - a call on the host actor. If the host doesn't implement the interface, initialization aborts: in editor / development builds the call trips a check() and crashes; in shipping / test builds the check is compiled out and the manager never initializes - no trees, no nodes, and no error logged. This step is not optional.ICrimsonSkillTreeInterface (C++). On Play the manager initializes and OnSkillTreeStateUpdated can broadcast.3. Create a skill tree asset
Content Browser -> right-click -> Crimson -> Skill Tree Asset. Double-click to open the two-graph editor. In Logic mode, right-click -> Add Skill, wire it from the Root node's Out pin. Switch to Visual mode to see the auto-spawned mirror and lay it out.
4. Configure the trees
The manager initializes itself - in BeginPlay it binds to the owning pawn/controller and builds the runtime tree instances once they're ready, so there is no init function to call. Your one job is to fill `Configured Skill Trees` with the tree assets it should own (each entry pairs a type tag with a UCrimsonSkillTree). GAS-driven conditions and events resolve the owner's Ability System Component automatically.
AddDynamicSkillTree (e.g. from equipment or a Game Feature) and remove them with RemoveDynamicSkillTree.OnSkillTreeStateUpdated broadcasts when node state changes.5. Activate a node at runtime
Client code calls the manager; the manager fires a server RPC and validates authoritatively. Read the target NodeGuid from the asset or a UI widget.
Set on both, and OnSkillTreeStateUpdated broadcasts so your UI can refresh.