This is meant to be a Game Feature Plugin for the Lyra Sample Game that adds networked portal mechanics in the third person perspective.
Developed on macOS Sonoma 14.2.1 with UE 5.3.2.
Clone the plugin and add it to the Game Features directory in a fresh install of Lyra or an existing project.
ProjectName > Plugins > GameFeatures
It is recommended to clean the build. i.e. In Rider Build > Clean Solution.\
Project Settings
Support global clip plane for Planar Reflections = true
. This is not strictly required, but enabling it allows for any surface to be used for the portals. Without it, custom planes and a specific level layout would be required so that the Capture Component can correctly see through the surface.
BP_Portal
- Set InitialPortalMaterial (
M_InitialPortalMaterial
)
BP_PortalPlayerController
- Set portal class (
BP_Portal
)
BP_PortalHero
- Change CharacterMovement component class to PortalMovementComponent
GA_Portal
- Set widget class (
WBP_Portal
), portal class (BP_Portal
), portal effect class (GE_PortalEffect
) - Set ability tags Ability.Type.Action.Portal
- Set ability triggers for Event.PortalA & Event.PortalB
After cloning the plugin and adding it to a project, open L_TestMap > use PIE.
- LMB: spawn portal A
- Shift + LMB: destroy portal A
- RMB: spawn portal B
- Shift + LMB: destroy portal A
All other controls are the same as the Elimination experience.
Portal
- The main class for the portal. Handles the portal rendering and teleportation logic. Currently
TeleportActor
just handles teleporting players, but can be extended to teleport objects.
PortalPlayerController
- Handles portal spawn logic, but uses
SpawnActorDeferred
to allow the ability to packEffectContextHandle
in PortalAbility with data to pass around.
PortalAbility
-
Handles ability activation and removal. Inside
FinishSpawningPortal
,FinishSpawning
is called to completeSpawnActorDeferred
from the controller. -
There was an issue with the UIExtension not correctly unregistering in blueprint. The issue was resolved by adding a one tick delay to garbage collection. There is a note about it in the code. In short, an ability instance is marked for garbage collection before blueprint function
K2_OnAbilityRemoved
is called, so this results in the blueprint eventOnAbilityRemoved
not properly working.
PortalAttributeSet
- This adds the attribute MovementSpeed that is used for the player speed boost after teleportation.
PortalMovementComponent
- Created to support the MovementSpeed attribute from PortalAttributeSet.
BP_Portal
- Handles the invisible effect after teleporting. The effect is only applied to the hero avatar. For the weapon, I chose to use the same method Fortnite uses by setting the relative scale to 0 and ramping it back up to 1.
BP_PortalPlayerController
- Handles input for creating and destroying portals.
SendGameplayEventWithPayload
is called to activate the portal ability. - The distance a portal can be spawned from the player can be adjusted using PortalDistanceModifier.
BP_PortalHero
LinkAnimLayers M-F
was created to resolve an issue with Lyra when starting a game unarmed. This function will correctly link the matching animations for the male, female avatars.- The CharacterMovement component classes uses PortalMovementComponent instead of LyraCharaterMovementComponent to apply a speed boost after teleporting.
M_PortalMannequin
- Uses PortalMaterialFade parameter to apply
DitherTemporalAA
for the invisible effect after teleporting.
GA_Portal
- Handles registering and unregistering the portal widget as well as adding and removing the input mapping for the portal controls (
IMC_Portal
). When the ability is added, the portal widget is registered the UI will update the quick bar and HUD to show the portal icons. - Handles ending the ability by listening for changes of the attribute PortalAttributeSet.MovementSpeed.
GE_PortalEffect
- Applies a movement speed boost for 3 seconds.
- Blocks the dash ability (Ability.Type.Action.Dash) while the speed boost is active.
WBP_PortalHUDLayout
- Holds the new slot for ExtensionPoint HUD.Slot.Ability, which is the location of
WBP_Portal
.
WBP_Portal
- Handles the portal status indicator on the HUD. When a portal is active a corresponding color is shown. Blue for Portal A and Orange for Portal B. This widget also shows the control input for spawning a portal, left and right mouse button in this case.
ID_PortalItem
- This is an inventory fragment that uses equipment definition
WID_Portal
to grantAbilitySet_PortalAbility
and attachBP_PortalItem
to weapon_r socket.BP_WeaponInstance_PortalItem
is set, but only to use the Animations for the item. Portal mesh was created to use inBP_PortalItem
.
BP_GrantAbility
- This was made with inspiration from
B_WeaponSpawner
, but instead it grants and ability and adds a corresponding item to the quick bar. When the player overlaps this actor, they are given a portal item, which addsAbilitySet_PortalAbility
to the player's Ability System Component.AbilitySet_PortalAbility
grantsGA_Portal
andPortalAttributeSet
.
BP_RemoveAbility
- Handles removal of the portal item and input mapping
IMC_Portal
.
Experiences and Game directories
- Blueprints and data assets copied over and customized to use in the new map
L_TestMap
. BP_PortalExperience
is used to set all relevant settings and data. This experience is tied to the playlistDA_PortalPlaylist
so that it can be access through theLyraFrontEnd
.DA_PortalTagRelationships
is added, but unchanged from default for now.
Bugs and Enhancements are outlined here: https://github.com/kurtw/PortalGame/issues