The Generic Activity Framework is a collection of interlinked boilerplate C++ classes that set the stage for scalable hierarchical activity processing using Gameplay Tags.
It was initially part of one bigger plugin but got split up into its own independent module in order to potentially serve many other opinionated formats that semantically agree with the same guiding principles established by GenericActivityFramework.
The goal is to be able to build 'spin-off systems' that have much more blueprint exposure while letting this framework be the underlying native foundation (if you agree with the principles it designates).
It's entirely server-side, build on the idea that clients should not (predictively) reason about anything themselves, but merely reflect the server's decisions by receiving replicated pawn− or other tangible actor information.
There are 3 types of activities: World-, Crowd-, and Agent Activities. By default, they could be seen as merely a 'pointer' to an action without carrying additional state.
FWorldActivity structures are performed by world activity workers. The phrase 'world activity worker' is a colloquial term for any
IGenericWorldActivityWorker-inheriting class. Likewise,
FCrowdActivity structures are performed by crowd activity workers. The phrase 'crowd activity worker' is another way of saying "any class that inherits from
FAgentActivity structures are performed by agent activity workers. The phrase 'agent activity worker' is another way of saying "any class that inherits from
Agent activities (performed by AIControllers) represent a singular action carried out by a pawn.
Only its initiating crowd activity worker is authoritative in deciding what
FAgentActivity the agent activity worker is running next. The agent is not aware of any motive behind its assigned
FAgentActivity and never begins one itself.
Crowd activities represent an action carried out by multiple agents. Example: "This crowd activity spawns X members that attack hostiles around area X on the map".
Only its initiating world activity worker is authoritative in deciding what
FCrowdActivity the crowd activity worker is running next. The crowd is not aware of any motive behind its assigned
FCrowdActivity and never begins one itself.
World activities represent an action carried out by multiple crowds. Example: "This world activity spawns various crowds around the map at specific places".
GameplayConcepts were designed as a means to statically extend GenericActivityFramework in such a way that allows you to build reusable, self-contained modules that solve a specific need statically, without depriving GenericActivityFramework of its unopinionatedness.
GameplayConcepts may declare any type, or privately introduce additional dependencies themselves (and not let the rest of the engine know about it).
This keeps GenericActivityFramework very lean and unopinionated, capable of working with standalone gameplay ideas. (Whereas constantly forking GenericActivityFramework to add your own gameplay logic takes away its unopinionated stance.)