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.
CrimsonSkillTree is 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 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.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.
Open your Player State Blueprint and use Components -> Add Component, then pick Crimson Skill Tree Manager (it is listed under Crimson Skill Tree). Leave its defaults alone for now - step 4 fills its Configured Skill Trees list, and there is no init node to place.
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.
On the same Player State Blueprint: Class Settings -> Details -> Interfaces -> Add -> Crimson Skill Tree Interface. In My Blueprint -> Interfaces, double-click each of the three events it adds and return a value from every one.
| Interface event | Return |
|---|---|
| Get Skill Tree Owner | Get Pawn (the Player State's own pure getter) into the Return Node |
| Get Skill Tree Owner Character | Get Pawn -> Cast To Character into the Return Node |
| Get Skill Tree Manager Component | The Skill Tree Manager component variable added in the step above |
ICrimsonSkillTreeInterface::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.
Select the Skill Tree Manager component on the Player State and open Details -> Skill Trees | Configuration -> Configured Skill Trees. Add one array entry and fill its two fields: Skill Tree Type Tag (e.g. SkillTree.Combat) and Skill Tree Asset (the asset from step 3). That is the whole step - there is no initialization node to place.
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.
In any graph on the local player: Get Skill Tree Manager -> Request Skill Node Action (Target Node Guid = the node's GUID, Action Type = Activate). Get Skill Tree Manager is a pure node under Skill Tree | Utilities and takes the world context automatically.
Holding the GUID as text instead? Either convert it with Make GUID from String (the compact -> autocast node) or skip the conversion and call Request Skill Node Action By String with the same Action Type.
Set on both, and OnSkillTreeStateUpdated broadcasts so your UI can refresh.