API Reference
Core types
| Type | Category | Description |
|---|
UCrimsonSkillTree | Asset | Tree data asset - nodes, graph config, presentations, connection paths |
UCrimsonSkillTree_Node | Asset | A single node - costs, activation conditions, node events, state |
UCrimsonSkillTree_Edge | Asset | Directed edge; per-edge conditions, events, color overrides, LOD |
UCrimsonSkillTreeManager | Runtime | Replicated component: budgets, levels, RPCs, loadouts, save data |
UCrimsonSkillTreeBlueprintLibrary | Runtime | BP helpers - node lookup, cost formatting, simulation |
Host contract
The actor that hosts a UCrimsonSkillTreeManager must implement `ICrimsonSkillTreeInterface` (all three methods are BlueprintNativeEvent). The manager calls these on its owning actor to resolve the logical effect owner; without the interface, initialization fails (crash in development builds, silent no-op in shipping - see Quick Start step 2).
| Method | Returns / purpose |
|---|
GetSkillTreeOwner() | The actor that logically owns the tree's effects - typically the controlled Pawn/Character |
GetSkillTreeOwnerCharacter() | The owning ACharacter (used by character-scoped events such as float-property modifiers) |
GetSkillTreeManagerComponent() | The host's UCrimsonSkillTreeManager instance |
Sub-node bases
| Type | Purpose |
|---|
UCrimsonSkillTree_ActivationConditionBase | Prerequisite check before a node activates |
UCrimsonSkillTree_NodeEventBase | Effect fired on level-up / level-down / reset |
UCrimsonSkillTree_EdgeConditionBase / UCrimsonSkillTree_EdgeEventBase | Edge-scoped condition / event |
FNodeResourceCost / FNodeCostDefinition | A cost (flat or curve-scaled) and its resource source |
Connection line styles
| Type | Description |
|---|
UCrimsonSkillTreeWidget_LineDrawingPolicyBase | Abstract, swappable connection-line strategy (GraphConfig.LineDrawingPolicy) |
USkillTreeLineDrawingPolicy_StraightLine / _ElbowLine | Built-in straight and elbow styles |
UCrimsonSkillTreeWidget_ConnectionLayer | Single runtime widget that paints every connection (material-capable strip or anti-aliased polyline) |
FCrimsonSkillTree_ConnectionPath | Per-connection authored path (anchors, material, shape curve) on ConnectionPaths |
ECrimsonConnectionAnchorMode | Attach mode enum |
Widgets
| Type | Description |
|---|
ICrimsonSkillTreeNodeWidget | The node contract. Implement on any UUserWidget to use it as a node - no plugin base class required. UCrimsonSkillTreeWidget_Node is a ready-made implementation you may subclass instead (On Update Node Appearance / On Node Hovered) |
ICrimsonSkillTreeDecorationWidget | The decoration contract (panel / header / divider) - InitializeSkillTreeDecoration. The host resolves the class from the decoration's WidgetClassOverride, else GraphConfig.DecorationWidgetClasses[Kind]. UCrimsonSkillTreeWidget_Decoration is the ready-made implementation |
UCrimsonSkillTreeUIStatics | Blueprint helpers a node needs without inheriting anything - Request Skill Node Action. UCrimsonSkillTreeWidget_NodeTooltip remains available as a ready-made tooltip |
| Screen + canvas | You build these - see How-To: Display the Skill Tree. A prebuilt UCrimsonCoreSkillTreeScreen / UCrimsonCoreSkillTreeGraph also exists (CrimsonCore - requires all Crimson plugins), listed for orientation only |
Runtime structs & enums
| Type | Description |
|---|
FSkillNodeChangeRequest | A single node action in a batch (NodeGuid + ActionType) |
FSkillTreeLoadout | Named snapshot of node levels in a tree |
FCrimsonSkillTree_SaveGameData / _SaveGameNodeState | Plain save structs (in CrimsonSkillTree_SaveData.h) |
FCrimsonSkillTree_VisualDecoration / ECrimsonSkillTree_VisualDecorationKind | One authored decoration on UCrimsonSkillTree::Decorations - Kind, GamePosition, GameSize, DisplayText, TintColor (multiplies the widget's authored color; white = as authored) and the optional WidgetClassOverride. Panel / Header / Divider |
ECrimsonSkillNodeActionType | Activate / Deactivate / IncrementLevel / DecrementLevel |
ECrimsonNodeState | UnSet / Set / Max / Suppressed |
Config & extension
| Type | Description |
|---|
UCrimsonSkillTreeSettings | Project Settings -> Crimson -> Crimson Skill Tree |
UCrimsonGameFeatureAction_AddSkillTrees | Game Feature action injecting a tree into an actor at runtime |
Built-in node events & conditions
| Type | Effect / Check |
|---|
UCrimsonSkillTree_NodeEvent_ApplyGameplayEffect | Applies/removes a GE scaled to the node level |
UCrimsonSkillTree_NodeEvent_GrantGameplayAbility | Grants/removes a Gameplay Ability |
UCrimsonSkillTree_NodeEvent_ModifyCharacterFloatProperty | Adds/subtracts a named float property on the owner |
UCrimsonSkillTree_ActivationCondition_ParentLevel | Parent node at/above a minimum level |
UCrimsonSkillTree_ActivationCondition_AttributeRequirement | A GAS attribute meets a threshold |
UCrimsonSkillTree_ActivationCondition_ResourcePointsSpent | A minimum number of points spent in the tree |
UCrimsonSkillTree_Condition_CompositeBase (+ _AND / _OR) | Combine conditions with AND / OR |
Connection visual states
| Type | Purpose |
|---|
ECrimsonConnectionVisualState | Locked / Unlockable / Active / Maxed - resolved from live node data |
FCrimsonConnectionLineStyle | Per-state look: color, thickness, brush (material-capable), opacity |
FCrimsonConnectionFillSettings | Progress-fill animation (FillAlpha material parameter, duration, easing, line-split fallback) |
FCrimsonConnectionTransitionSettings | State crossfade (duration, easing, optional material parameter) |
FCrimsonConnectionHoverSettings | Runtime hover (tolerance px, hover style, blend time) |
UCrimsonSkillTreeWidget_ConnectionLayer | Single widget painting all connections; hover hit-testing + OnConnectionHoverChanged |
UCrimsonSkillTreeWidget_LineDrawingPolicyBase::ResolveConnectionState/Style | State + style resolution (override points for custom policies) |
CrimsonSpline::BuildShapedPolyline | Chord + perpendicular shape-curve polyline (fixed 0..1 domain, endpoints pinned to the anchors) |
System readiness
Announced as a ModularGameplay feature state: UGameFrameworkComponentManager::ChangeFeatureInitState(Actor, CrimsonSkillTreeTags::SystemReadyFeatureName, Manager, TAG_Crimson_SystemReady_SkillTree), with SystemReadyFeatureName = "Crimson.SystemReady.SkillTree". Wait on it rather than polling for the component: RegisterAndCallForActorInitState(Actor, CrimsonSkillTreeTags::SystemReadyFeatureName, FGameplayTag(), Delegate, true) (C++), or read the manager with GetImplementerForFeature.
| Tag constant | Tag | Announced when |
|---|
CrimsonSkillTreeTags::TAG_Crimson_SystemReady_SkillTree | Crimson.SystemReady.SkillTree | Announced once the manager exists, has its configured trees assigned, and is registered. |