Tag-based teams & factions with dynamic attitude — change a tag at runtime and even AI perception re-evaluates friend or foe.
Gameplay · Multiplayer · Unreal Engine 5
Teams that change mid-match — and the AI actually notices.
A replicated, tag-based team & faction system where attitude is computed live from gameplay tags. Flip a team or hostility tag at runtime and every actor re-evaluates friend or foe — including AI perception, which Unreal otherwise checks once and never again.
Why CrimsonTeams
A complete friend-or-foe layer — replicated, GAS-aware, AI-aware, and built to change at runtime.
Tags, not numeric IDs
Teams are gameplay tags, so an actor can belong to several at once and factions nest naturally. Attitude is a pure function of the tags on each side — friendly, neutral, or hostile.
Dynamic attitude & live re-aggro
Change a team or hostility tag at runtime and every actor re-evaluates. The system refreshes AI perception so enemies re-aggro without re-perceiving from scratch — the mid-match defection problem, solved.
Built for multiplayer
Server-authoritative team state with delta-replicated tags. Clients receive results by replication and re-fire change delegates from OnRep, so gameplay and UI stay correct on every machine.
Damage gating & GAS targeting
One call gates friendly fire; MakeFilteredTargetDataFromActors filters AoE by attitude (hostile-only, friendly-only, and more) straight into a GAS target-data handle.
Declared teams & team colors
Declare named teams on the Game State, auto-assign players, and drive per-team material/Niagara colors from a display asset — with async observers that keep nameplates and UI in sync.
A multiplayer dev-tools window
Inspect every agent, an N×N attitude matrix, the team registry, and a server-vs-client replication diff — edit teams live and watch them propagate. Plus CycleTeam / SetTeam / ListTeams cheats.
A closer look
Friend or foe in three steps
Add a Team Agent Component, give each actor its team and hostile tags, and ask GetTeamAttitudeBetween. Team.Red vs Team.Blue reads Hostile; two reds read Friendly; no team reads Neutral. That's the whole foundation.
Decoupled by design
The team contract — ICrimsonTeamAgentInterface — lives in CrimsonCommon, not here. Any plugin can read a team or attitude through it with zero dependency on CrimsonTeams. The Cardinal Rule in action.
Wire it to AI in one override
Unreal's perception reads attitude off the perceiving actor, so you forward one method on your AI controller or pawn to GetTeamAttitudeBetween. Using CrimsonCore? Its classes already do it — perception reads Crimson attitudes out of the box.
Technical details
- Engine
- UE 5.8
- Platforms
- Windows, Mac, Linux
- Blueprint-ready
- Yes
- C++ required
- No
- Network replicated
- Yes
- Dependencies
- CrimsonCommon, GameplayAbilities, AIModule, Niagara
- Last updated
- June 2026
Frequently asked questions
Do I need C++ to use it?
Does it work in multiplayer?
OnRep. A built-in dev-tools tab diffs server vs client so you can confirm it.Will my AI actually re-evaluate when teams change?
ForgetActor), so an actor that just turned hostile gets perceived and a new ally is ignored — without leaving and re-entering perception.Does it depend on other Crimson plugins?
Does it integrate with GAS?
Build factions that react in real time
Drop in the agent component, tag your actors, and you've got replicated friend-or-foe with live AI re-aggro. Start with the Quick Start or follow the course.
Completes your setup
Built on the free CrimsonCommon foundation, so it pairs cleanly with the rest of the suite: