Skip to content

Installation

There are two ways to use GASPALS:

  • Open the template project (GASPALS.uproject). Everything is already configured. Use this to explore the demo, and as the starting point of a new game.
  • Add the plugin to an existing project. Copy the plugin folder, then copy a few project settings that a plugin cannot carry by itself.

Requirements

Engine Unreal Engine 5.8
Code None. GASPALS is a content plugin with no C++ module; the project can be Blueprint only.
Engine plugins Declared in GASPALS.uplugin and enabled automatically with GASPALS (see below).
Packaging A C++ toolchain (Visual Studio 2022 on Windows). The engine plugins GASPALS uses are not enabled by default, so the packaging tool builds a small game target even for a Blueprint-only project. Running in the editor needs no compiler.
Disk space The plugin holds the Game Animation Sample animation set and a MetaHuman, so expect several gigabytes.
Engine plugins enabled by GASPALS
Area Plugins
Animation PoseSearch (motion matching), Chooser, BlendStack, AnimationWarping, MotionWarping, CurveExpression, FullBodyIK, RigLogic, MovieSceneAnimMixer, PhysicsControl
Movement Mover, ChaosMover, MoverExamples (Mover brings NetworkPrediction)
Interaction and AI GameplayInteractions, SmartObjects, StateTree, GameplayStateTree
Characters and UI HairStrands, LiveLink (MetaHuman), ModelViewViewModel, DrawDebugLibrary
Editor tools only EditorScriptingUtilities, GeometryScripting

The camera system uses Gameplay Cameras, which is enabled by default in 5.8.

Option A: open the template project

  1. Get the project folder (it contains GASPALS.uproject, Config/ and Plugins/GASPALS/).
  2. Right-click GASPALS.uproject > Switch Unreal Engine version if it is not associated with 5.8, then open it.
  3. The first launch compiles shaders and builds the motion matching databases. This takes a while once.
  4. The editor opens RagdollLevel. Open /GASPALS/Levels/DefaultLevel for the main demo, then continue with the Quick start.

Development plugins in the template

The template project also enables a few editor-only development plugins (BlueprintAssist and AutoSizeComments for graph formatting, and editor tooling plugins). GASPALS does not need them. If one is missing on your machine, remove its entry from GASPALS.uproject or answer No when the editor offers to disable it.

Option B: add GASPALS to your project

1. Copy the plugin

Close the editor, then copy the folder Plugins/GASPALS into your project's Plugins folder (create it if needed):

YourProject/
├── YourProject.uproject
├── Config/
└── Plugins/
    └── GASPALS/
        ├── GASPALS.uplugin
        ├── Content/
        └── Docs/

Open the project. The engine enables GASPALS and the plugins it depends on. In the Content Browser, enable Settings > Show Plugin Content to see the GASPALS Content folder.

2. Copy the project settings

Some settings live in the project's config files, not in the plugin: collision channels and profiles, data-driven console variables, navigation, and a few engine settings. Without them, traversal finds no obstacles, the camera system and the locomotion setup fall back to defaults, and cover runs do not path on clients.

The Project settings reference explains each line. The short version: add these blocks to your project's Config/DefaultEngine.ini (merge with existing sections of the same name).

Config/DefaultEngine.ini
[/Script/Engine.CollisionProfile]
+Profiles=(Name="ObstaclePreset",CollisionEnabled=QueryAndPhysics,bCanModify=True,ObjectTypeName="Obstacle",CustomResponses=((Channel="WorldStatic",Response=ECR_Ignore),(Channel="WorldDynamic",Response=ECR_Ignore),(Channel="Pawn",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore),(Channel="Vehicle",Response=ECR_Ignore),(Channel="Destructible",Response=ECR_Ignore)),HelpMessage="Moving Obstacles for Physics Obstacle Course")
+Profiles=(Name="TraversalObjectPreset",CollisionEnabled=QueryAndPhysics,bCanModify=True,ObjectTypeName="WorldDynamic",CustomResponses=((Channel="Traversable")),HelpMessage="Traversable Level Blocks")
+Profiles=(Name="CharacterCapsule",CollisionEnabled=QueryAndPhysics,bCanModify=True,ObjectTypeName="Pawn",CustomResponses=((Channel="Visibility",Response=ECR_Ignore),(Channel="Camera",Response=ECR_Ignore)),HelpMessage="Character capsule")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="Traversable")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="Mouse")
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel3,DefaultResponse=ECR_Ignore,bTraceType=False,bStaticObject=False,Name="Obstacle")
+EditProfiles=(Name="Ragdoll",CustomResponses=((Channel="Camera",Response=ECR_Ignore),(Channel="Obstacle")))

[/Script/Engine.DataDrivenConsoleVariableSettings]
+CVarsArray=(Type=CVarInt,Name="DDCvar.Traversal.DrawDebugLevel",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarFloat,Name="DDCvar.Traversal.DrawDebugDuration",ToolTip="",DefaultValueFloat=1.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.MMDatabaseLOD",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCvar.DrawVisLogShapesForFoleySounds",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCVar.AttributeBasedRootMotion.Enable",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarFloat,Name="DDCvar.OffsetRootBone.TranslationRadius",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCVar.ExperimentalStateMachine.Enable",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCVar.ExperimentalStateMachine.Debug",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCVar.ThreadSafeAnimationUpdate.Enable",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=True)
+CVarsArray=(Type=CVarBool,Name="DDCVar.NewGameplayCameraSystem.Enable",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=True)
+CVarsArray=(Type=CVarInt,Name="DDCvar.LocomotionSetupCMC",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.LocomotionSetupMover",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=1,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCVar.DefaultAnimSet",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=True)
+CVarsArray=(Type=CVarInt,Name="DDCvar.StrafeStyle",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=1,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.AimStyle",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.CameraStyle",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=1,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCvar.UseUnrealAnimationFramework",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCvar.DrawCharacterDebugShapes",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCvar.DrawCharacterDebugStates",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarBool,Name="DDCvar.DrawCharacterDebugGraphs",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.FootPlacementMode",ToolTip="0 == off, 1 == foot placement node, 2 == biped control rig",DefaultValueFloat=0.000000,DefaultValueInt=1,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.ControlStyle",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.PawnClass",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=-1,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.VisualOverride",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=-1,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCvar.AnalogInputStyle",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=1,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCVar.CharacterPhysics.DrawDebug",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=0,DefaultValueBool=False)
+CVarsArray=(Type=CVarInt,Name="DDCVar.CharacterPhysics.DefaultProfile",ToolTip="",DefaultValueFloat=0.000000,DefaultValueInt=1,DefaultValueBool=False)

[/Script/NavigationSystem.NavigationSystemV1]
bAllowClientSideNavigation=True

[/Script/PoseSearch.PoseSearchSettings]
AvailabilitiesBufferSize=230

[/Script/Engine.PhysicsSettings]
bSubstepping=True
MaxSubstepDeltaTime=0.016667
MaxSubsteps=16

[/Script/Engine.Engine]
NearClipPlane=1.000000

[ConsoleVariables]
p.EnableCharacterAccelerationReplication=1
net.SubObjects.DefaultUseSubObjectReplicationList=1
fx.Niagara.ForceLastTickGroup=1

Also copy these two files from the template's Config/ folder (or merge them if you already have them):

File Contents Needed for
DefaultNetworkPrediction.ini Network Prediction settings: independent ticking, interpolated simulated proxies, input send counts. The Mover pawns in multiplayer.
DefaultGameplayTags.ini Gameplay tags: Foley.Event.*, MotionMatching.*, SmartObject.*, StateTree.* and redirects. Foley sounds, motion matching database tags, the smart object and NPC demos.

Collision channel slots must match

GASPALS traces the Traversable channel as the first custom trace channel (ECC_GameTraceChannel1), and its assets store channels by slot, not by name. If your project already uses GameTraceChannel1-3 for something else, either move your channels to later slots or expect traversal and the demo tools to trace the wrong channel. Check Project Settings > Engine > Collision after the merge: the three channels must be listed in the order Traversable, Mouse, Obstacle.

Rendering settings for the MetaHuman

The demo MetaHuman (Kellan) needs the skinning settings of the template's [/Script/Engine.RendererSettings] section: r.GPUSkin.Support16BitBoneIndex=True, r.GPUSkin.UnlimitedBoneInfluences=True, r.SkinCache.CompileShaders=True and r.SkinCache.DefaultBehavior=0. Copy them too if you keep Kellan.

3. Packaging settings

In Config/DefaultGame.ini:

Config/DefaultGame.ini
[/Script/Engine.AssetManagerSettings]
+PrimaryAssetTypesToScan=(PrimaryAssetType="GameFeatureData",AssetBaseClass="/Script/GameFeatures.GameFeatureData",bHasBlueprintClasses=False,bIsEditorOnly=False,Directories=((Path="/Game/Unused")),SpecificAssets=,Rules=(Priority=-1,ChunkId=-1,bApplyRecursively=True,CookRule=AlwaysCook))

[/Script/UnrealEd.ProjectPackagingSettings]
+MapsToCook=(FilePath="/GASPALS/Levels/DefaultLevel")

The GameFeatureData entry is required by one of the enabled engine plugins: without it, the cook fails with an unknown cook failure. Replace the map with your own levels.

4. Restart and check

  1. Restart the editor so the collision channels and console variables load.
  2. Open /GASPALS/Levels/DefaultLevel and press Play. You control the CMC pawn (press N to switch to the Mover pawn). Run at a low block and press Space to vault: if the character only jumps, the collision channels are not set up (see the warning above).
  3. Set a game mode and default map for your own levels: see Use GASPALS in your own project.

Updating GASPALS

GASPALS is a template: you are expected to change its assets. To take a newer version later, keep your changes in your own assets where you can (child Blueprints, your own data assets and levels) and replace the plugin folder. Assets you edited inside Plugins/GASPALS need merging by hand.

Next steps