CrimsonTeams
A replicated team system where teams are gameplay tags, not numeric ids - so an actor can be on several teams at once and factions nest naturally. Any actor becomes team-aware by holding a UCrimsonTeamAgentComponent; attitude (friendly / neutral / hostile) is a pure function of the tags on either side. The headline feature is dynamic attitude: when a team or hostility tag changes at runtime, every other actor re-evaluates - including AI perception, which Unreal otherwise evaluates once per stimulus and never re-checks.
Two ways to read this
Use the Blueprint / C++ / Both switch at the top of the window. Blueprint readers get editor screenshots; C++ readers get code; Both shows everything side by side.
Attitude, at a glance
UCrimsonTeamStatics::GetTeamAttitudeBetween(Source, Target) is the single source of truth, evaluated in this order:
| Priority | Rule | Result |
|---|---|---|
| 1 | Either side's HostileToTags overlaps the other's TeamTags | Hostile |
| 2 | The two share any TeamTag | Friendly |
| 3 | Neither side resolves a team component, or no rule matched | Neutral |
What's included
| Area | Key Types | Purpose |
|---|---|---|
| Membership | UCrimsonTeamAgentComponent, ICrimsonTeamAgentInterface | Per-actor team/hostile tags; the interface (in CrimsonCommon) lets other plugins query attitude with no CrimsonTeams dependency |
| Attitude & queries | UCrimsonTeamStatics, UCrimsonTeamSubsystem | Attitude, damage gating, GAS target filtering, agent resolution, faction tag stacks |
| Dynamic re-eval | UCrimsonTeamSubsystem::OnTeamAttitudeChanged | On any team change, refreshes AI perceivers so they re-aggro without re-perceiving from scratch |
| Declared teams | UCrimsonTeamCreationComponent, ACrimsonTeamPublicInfo / PrivateInfo | Declare teams on the Game State, auto-assign players, materialize replicated team-info actors |
| Cosmetics | UCrimsonTeamDisplayAsset | Per-team material/Niagara parameters + short name; apply to actors and UI |
| Observers | UAsyncAction_ObserveTeam, UAsyncAction_ObserveTeamColors | Blueprint async nodes that fire on team / color change |
| GameFeature (CrimsonCore) | UGFA_AddTeams | Data-driven way to add the agent component + tags to actor classes. Defined in CrimsonCore (needs all Crimson plugins); standalone projects use a default subobject or Add Component instead - see How-To: Make an Actor a Team Agent |
| Tooling | Dev Tools window + console cheats | Crimson.Teams.DevTools (multiplayer inspector), CycleTeam / SetTeam / ListTeams |
Plugin dependencies
| Type | Name |
|---|---|
| Crimson | CrimsonCommon |
| Engine modules | Core, CoreUObject, Engine, GameplayTags, GameplayAbilities, AIModule, ModularGameplay, Niagara |
Decoupled by design
The contract
ICrimsonTeamAgentInterface lives in CrimsonCommon, not here. Any plugin can read a team or attitude through it without depending on CrimsonTeams - the Cardinal Rule in action.Where to go next
- New here? Quick Start - two actors treating each other as enemies, end to end.
- Specific tasks: the How-To pages (make an agent, query attitude, react to changes, declared teams & colors, debug at runtime).
- Mental model: Concept: Dynamic Attitude & Multiplayer and Concept: Team Registration & Info Actors.
- Signatures: API Reference.