#Mover: Wall Run & Testing
1 messages · Page 1 of 1 (latest)
Continued a bit with integrating a dash and the transitions between dashing/wallrunning/falling.
(ignore my skill issue at the first jump lol)
Mover: Wall Run & Testing
The inputs, Do they come from GAS?
They do yes, however I just use them as an intermediary to raise&lower the flags in a separate component that produces the Mover input
I'm very curious to learn how you link the GAS input tag/ability to these mover inputs
That's awesome. Is this replicated? Trying to figure out what exactly is involved in replicating a new state
Yes it is. The project is a multiplayer game.
Well it is quite a defaulted GameplayAbility that triggers an AbilityTask to keep track of the current input state.
And from that AbilityTask, all I do is setting certain flag to true or false in my (own) MovementInputsComponent.
The ProduceInput() function grabs them and then I have free will to do with the input flag whatever i want
void UBotaniAbilityTask_Jump::Activate()
{
[...]
//@TODO: Check if we can jump ??? (mover also does this, so it might be a double-check)
StartJumping();
[...]
{
void UBotaniAbilityTask_Jump::StartJumping()
{
UBotaniMovementInputComponent* MovementInputs = GetMovementInputComponent();
if (!IsValid(MovementInputs))
{
return;
}
// Only locally controlled pawns should trigger the actual jump action.
if (IsLocallyControlled())
{
MovementInputs->Jump();
}
if (ShouldBroadcastAbilityTaskDelegates())
{
OnJumped.Broadcast();
}
}
Makes sense, thanks ❤️
yw !
Do these ability tasks implement the IMoverProduceInput Interface?
Aah I see, a custom component and the abilities are pulling off of that
void UBotaniMovementInputComponent::Jump()
{
// Is this the first frame we want to jump?
bWantsToJump = !bIsJumpPressed;
// Update the flag
bIsJumpPressed = true;
}
void UBotaniMovementInputComponent::ProduceInput_Implementation(
int32 SimTimeMs,
FMoverInputCmdContext& InputCmdResult)
{
[.......]
//Passing in the flags
{
// Set the jump flags
BotaniAbilityInputs.bIsJumpPressed = bIsJumpPressed;
BotaniAbilityInputs.bJumpPressedThisFrame = bWantsToJump;
// Set the sprint flags
BotaniAbilityInputs.bIsSprintPressed = bIsSprintPressed;
BotaniAbilityInputs.bSprintPressedThisFrame = bWantsToSprint;
// Set the crouch flag
BotaniAbilityInputs.bIsCrouchPressed = bIsCrouchPressed;
BotaniAbilityInputs.bCrouchPressedThisFrame = bWantsToCrouch;
// Set the dash flag
BotaniAbilityInputs.bIsDashPressed = bIsDashPressed;
BotaniAbilityInputs.bDashPressedThisFrame = bWantsToDash;
}
[.......]
pretty much this
yes, I made a component solely for mover inputs
yeah might be, it just makes more sense for me as I have multiple actors ,that arent related, who need mover input
I was also planning on having very granular movement modes.
Like one for idle, one for starts, one for stops etc.
Do you think thats a bad idea
Each of these will be a bit different, because of the rotation
One for turn in place
Basically one for every leaf node in my abp statemachine
It sounds like it yeah
will be a lot of transitions to handle
right now i only have 4-5 different modes and its already quite a handful of transitions
why exactly would you need so many different ones?
I think MovementModifiers could be what you want
Its because Im mapping out one to one the animation to the movement 
there's no need to do this
Itll be a bit hard to explain, but every state will follow slightly different rules for rotation and movement
what did you have to do to make the modes replicated? I'm used to CMC doing a lot of saved moves and stuff like that ('used to' - i'm not that good at movement netcode), so I'm unsure of what to do here
And for transitions, I was actually gonna do a hierarchical model
Grounded -> Jump
Grounded.Idle -> Jump can inherit from the parent
well mover handles a lot of the replication side itself as it uses the NetworkPredictionPlugin, as long as I stay within that "safe" environment there is not that much to worry about.
The only thing that you need to be aware of are outside modifiers/inputs you would need within the mover simulation
Something like that so the logic can be inherited
Well yeah sounds reasonable, but it still doesnt look like good practice splitting things up into actual MovementModes
interesting. What about things like stamina and such? Have you looked into anything like that?
In Mover examples, it seems like they don't actually ever overwrite the Mover component itself, so I'm wondering where stuff like that should be stored.
Grounded should remain a single movement mode afterall.
If you want to modifiy it, use FMovementModifierBase
Well stateful variables like stamina or health for instance should all go inside of the SyncStates
hmm interesting
Since you're using GAS, have you explored anything regarding attributes and synced variables like that?
In CMC this is a big no-no, I'm assuming its the same here, but I also assume if I have a GAS ability that I want to use stamina, I can just subtract stamina when I activate it? 🤔
Well the best way to modify values such as stamina should be within the mover simulation.
For instance movement modes, layered moves, instant moves etc etc.
But it is still something on my TODO list how I can make use of GAS Attributes within Mover
My future goal would be to make MaxSpeed driven by a GameplayAttribute, but I havent put my hands on that yet
Based on my understanding you shouldnt modify any mover state externally at any time.
Really? There's no way to lose stamina from some kind of environmental thing? 🤔
that seems weird
well just not directly
yeah i mean calling some function on mover or something like that is what i assumed
can layered moves affect state?
yes
Unlike CMC, the state of the Mover actor is not directly modifiable externally at any time.
which makes sense
I think its a communication / terminology issue
pressing a button, to me, is 'external'
maybe 'directly' is the word?
oh yeah well, external in terms of directly
in any case, if layered moves can affect state, seems like you could use a layered move to adjust the stamina or whatever else?

im not a native english speaker so I dont know that much about grammar
just need to figure out a way to reduce stamina when doing a thing that isn't directly movement related
no worries, I'm a native english speaker and I don't know that much about grammar either
i really appreciate all this help btw
that sounds more like a job for an Instant Move Effect
Honestly im glad there are other ppl doing mover too.
I felt so lonely !
i'm always hesitant to jump into new stuff, so thank you for taking the time to do so and to post stuff. I'd definitely be happy to come back to this thread as i try stuff out if you want!!
that seems like that could make sense, i'll look into those too
Yes for sure
there is still a lot on my list to do
regarded to movement modes
If I can ask, what are you working on right now?
I mean with Mover
I am just interested in seeing how it works in general. I am trying to make a 3rd person action game and want to know the scalability of mover so I can compare it to GMCv2
Oh I see
well Mover still has its flaws, also when it comes to debugging
Visual Logger is my best friend 
im sure it'll get better lol. im really interested in seeing how they handle chaos physics, im impressed with it so far
inevitably id want to roll my own ECS based movement system, maybe using Mass, but replication for that seems awful so im going to wait a bit more for that side of things to cook
lol yeah, I dont dare to touch ChaosMover
Sounds like a lot of work
it might be, im unsure though. I've never built any sort of complicated movement system from scratch so its hard for me to know what traps there are lol.
yeah well, for now mover is more than enough for me
yeah same
with that little learning material available..
good enough it seems like
big of a task enough
How is the state of mover as of 5.6?
What are the main features still missing to reach parity with cmc?
I cannot really find anything about it anywhere for some reason
can integrate advanced mover systems, inputs, transitions between dashing/wallrunning/falling, GAS and multiplayer support...
but cannot make a jump 😆
sorry i couldn't resist
not ready yet in terms of chaos physics i think, i would wait
otherwise it seems to be fine, still learning but you should check out Project Titan for additional examples
i know a YouTuber who will be doing a video on it relatively soon (next month or so I think)
Oh, i wanted to use it just for chaos lol, guess i will stick to cmc for now then. Thanks
i mean there are working examples, but it looks like there's a new 'chaos mover' with no examples yet, so I think that means its probably still cooking (thats how i arrived to my conclusion, someone else may know more)
wish you luck!
I've been trying to figure out exactly what I need to account for in terms of replication
I noticed some classes have serialization and stuff. Am I correct in m understanding that as long as I do that appropriately, the rest of the replication is handled?
For instance, as long as i serialize the sync states and fill out the necessary function overrides, its just expected that it is there and automatically works with the rollback / prediction / etc?
who?
wdym not make a jump
Oh lol you mean my bad gameplay?
I mean..
Yeah...
Bad
Well NPP does a lot of the heavy work for you,
as it already has builtin rollback support.
You have the InputCmd in which you can feed locally produced data, and from there on NPP processes that for you.
As long as you keep everything within that pipeline and dont try to modify it directly/externally you shouldn't have to worry too much about replication.
AFAIK thats also what mover intends to do, which is giving you more freedom for movement and less work in networking
Titan has a lot of issues tho
If you are fine with not having multiplayer support, then sure go ahead
But otherwise it seems the work they did in Titan is pretty much a refactored version of stock mover
the only thing "new" would be the physics wok
however dont expect it to work in multiplayer
they detach the player from the mover simulation entirely, so when you exit the wok, NPP will just reset you to the last state in which the player still was attached to mover
(not forgetting that they treat Authority as LocalPlayer.............................. )
Dont want to blame them too much tho, as I think it was never meant to work in non-singleplayer environments
okay yeah I was wondering about this
So did you subclass CharacterMoverComponent and such or did you just straight up make your own?
No I started from UMoverComponent
I dont like the way CharacterMoverComponent is setup
It comes with a few hardcoded things that you cant change which is really annoying
what were those things you didnt like?
I think i agree tho, I think doing it yourself seems easier mentally
well the helper methods for "IsFyling, IsFalling, etc" are quite nice.
But others like stance managing is not really extendable the way I would like.
They have a stance enum with just 2 entries, an existing FStanceModifier that I feel like is just for showcase purpose.
So to me it seems the CharacterMoverComponent is intended to represent the current CMC but using Mover framework instead.
I will also have stancing for my player, but it will be a few more than just the two that character mover comes with
Stances are things like jog / sprint within the grounded movement mode which doesnt require its own mode, is that right?
Yes
but not limited to ground movement tho
In case of CharacterMover it is Crouch and Prone
but thats it
with Prone not even being implemented btw
it makes sense that its just an example
those settings purely exist for the sake of representing "CMC in mover"
so I make the same assumption about CharacterMoverComponent and StanceModifier
For instance ?
loading screen plugin, except it wasn't async so it would hitch and you couldn't play movies and such
Linked Anim Layers, except they didn't showcase unique logic in a layer, and instead just used them as a worse kind of data asset (at least to my knowledge, could be wrong)
Gameplay cues, except one ability replicated sound/animations manually (in the melee ability I think, its been a few years so its a bit harder to remember)
The modular UI was really awesome, but it wasn't setup to be extendable for all types of games
some of those are less because of the 'demo effect' and more about Lyra intending to be an example of a particular game done like that, as opposed to a universal and highly extensible framework for all types of games
Yeah I agree, I grabbed a few plugin from Lyra and modified them for my usecase.
They have nice ideas and approaches, but afterall its just a fortnite ripoff intended to work for fortnite like games
A lot of it felt like it was more showcasing the underlying stuff, as opposed to being a representation of the best implementation you could do with the tech
which, is still awesome and i am still super thankful for lol
haha yeah
funny thing is how often they forgot to rename things to ULyra_SomeName_, here and there are still leftovers being called UFort_SomeName_
oh really???
yep
thats so funny hahaha
UFortSignificanceManager for example
i think they fixed a few tho in later versions
there is a lot of those leftovers haha
but hey, we got partially source code access to some fortnite classes
I'll spend some time thinking about how I want to structure my own mover component for scalability. I feel like sync states would be a good place for generic speed boosts and such.
Would you have any suggestions for doing a data oriented approach to adding new states? I could just make a list of static values in some kind of 'MyMoverValues' somewhere, but I'm unsure.
Ideally, I'd want a system where later on in development I could just add in a new stance, and have that update a bunch of parameters. Like if in development I decided I wanted a 'tired' state, which slowed movement and prevented certain other kinds of movement.
A sync state is great for the tags, but I need somewhere to store 'this tag blocks this state' and such
is it a performance no-no to access a data asset on tick for all the mover components?
hmm i guess i also need to learn how to set defaults
No I wouldnt say so, I make heavily use of scalable floats for almost all my parameters
would you be willing to show an example of what that looks like in your code? if not its okay too
i am mentally weak so seeing an example helps me get over that and start doing things lol
Well mover gives you a good starting point in making it data oriented as it is data oriented by default.
For stance changes like "tired" or idk what else, they give you MovementModifiers.
You don't necessarily need to have an enum like they do in CharacterMover for each stance
hmm i see
Sure I can, what would you be interested in
im mostly just unsure about where to store the data
and i guess default values
thats a bit unclear to me right now
well either you use shared settings (UObjects) that are accessible from anywhere in mover, or you put them into the actual movement mode / transition / etc
So like if i wanted the tag system from GAS with blocking, enabling, etc
I would want a sync state of tags, but i wouldn't necessarily want to store what they block / enable right there would i? I feel like that should be stored somewhere else
oooh, shared settings, fair enough ill look there next
i remember seeing that but didnt look deep on it
thank you!
yw yw
just let me know if you want to see anything specific from my code if it helps you
I dont want to share everything right now as its still a mess (hehe) but if i can help im happy
For (almost) every transition for instance I have a seperate gameplay tag container checking for tags that might block certain action
i have nothing specific yet, still trying to get the foundations down, but ill let you know 🙂
I see, so you just check in the transition itself
that makes sense actually
and is probably better, hmm
i was trying to think of a better way to do transitions, I almost wish there was like some 'utility ai' style thing where certain states get a priority based on context, and if i add a new state it can evaluate its own priority.
But that really ends up just feeling like you need to know all about the other potential states anyway and doesn't quite make as much sense here i think
I dont see why you should make transitions like that.
Transitions mostly only transition when an exact condition is met.
For instance my wall running starts if there is a wall, there is no need for any extra scoring/evaluation
for example
there are no required or blocked tags yet tho
But isnt the transition responsible for, well, any transition?
So like if you want to transition to falling, swimming, etc, doesn't each state need a transition to any of those states?
Technically a transition can transition into multiple modes.
However primarily they live on a movement mode and manage only one transition
I have WallRunning that owns WallJump transition
I see. WallRunning would also have a 'WallToGround' transition maybe? Like to go into falling if you just stop moving?
I actually have a transition for that, but I am not using it for the WallRunning.
The "WallToGround" transition would only exist to check if the current wall is valid or not, which i can easily check inside the WallRunning movement mode itself.
Also because while i am simulating the wall could be invalidated and i dont want to rely on the transition to detect that fast enough but rather just let the WallRunning mode handle it
still have them
Hmm okay
So if I had a flying mode for instance
I would need a dedicated transition for going into water (for swimming), a dedicated transition for hitting the ground (for grounded movement), etc. Suppose I had a grapple hook, I'd also need a transition for that if that was a dedicated mode for whatever reason
There's no way to just do like 'Exit this mode, go to a default mode, re-evaluate entry'?
i feel like that part is a bit clunky but it makes sense
I feel like there should be a way to add in forces or something so that you dont really have separate modes. Hmm.
You are manually calculating in gravity right? Like that's not a default thing?
Yes and No, well how do I formulate that now...
What I found is that it is best practice to only use dedicated transitions when it wont be fatal if the transition triggers not "fast enough".
From Falling->WallRunning I have a dedicated one, its okay if i slide for a few ms on that wall until i start running on it.
But not out of WallRunning, if the wall is gone mid-simulation then I need to react to that immediately and should not rely on a transition.
If there is no wall anymore, but a few ms of the simulation still "think" there is a wall, i get very bad results
I see. So how do you handle that?
Well grappling for instance can just be a layered move, as at the end of the day it is "Falling" mode but with grapple velocity
Well essentially after every safe move in the WallRunning mode, I check if the wall I am running on is still valid.
If thats not the case, then I tell mover to trigger a new movement mode (falling) and refund the time that I didnt use, so that falling can use it
...
OutputState.MovementEndState.NextModeName = GetFallingModeName();
OutputState.MovementEndState.RemainingMs = DeltaMs - WallMoveData.PercentTimeAppliedSoFar;
...
Yes manually
For instance I have curves to determine gravity over time over velocity
interesting
I see, hmm
This makes sense I think
Are you doing based movement at all, on moving platforms I mean?
I have not been able to figure that one out, and I probably just won't haha
like i just wont do that, probably..
Yes
It doesnt differ that much, except you need to check for current base and do with the bases velocity whatever you want
it is bigger of a hassel to make sure the base is in sync, as in multiplayer that can and will cause desyncs
so how do you ensure order? Like how do you know that the base has moved, so its safe to update your character?
and to propagate that?
Or is it just when the base moves, you propagate, even if you've calculated the character already?
Well you dont really need to check which moves first, base or character.
The movement logic remains mostly the same, except when it comes to finalizing the frame, in which you can tell that any movement you just did should be relative to certain base
also meaning that by default base velocity doesnt get taken into account
Hmm, im not sure how that makes sense.
What handles the propagation of the moving base to the character?
Like suppose your base was moving 10000 units in that one frame, just hypothetical
Your character moves 10 units
where is it handled that the character moves the 10,000 also?
First of all when you are standing still on a moving base your character itself has no velocity.
In the MoverDefaultSyncState when it comes to update the new position of your character you can provide a base which it will then use to propagate the bases location onto the character location
ohhhh
I see
so im sure somewhere when doing the calculations, it gets the base first / propagates it before doing the simulation tick of the other one?
or at some point in the tick it propagates it
it does it at the end of the simulation, at the part where it comes to updating the new position/velocity/etc into the sync state
i see i see, that makes sense
awesome
thats much more clear
this system is pretty cool
it feels like a good introduction to learning about movement models without having to worry about all the other stuff, like the hardest parts definitely seem to be handled
Yes thats true, which is also what mover is designed for
the only very very annoying thing is that due to its modularity, settings or other things you want to access can be very nested
which is also the reason I am using ScalableFloats for almost all my movement settings, as I can easily back them up via a registry then
so all my settings are in one place
Yes I sometimes do
But nothing unusual found so far
it indeed has a decent impact on the networking part, but thats fine
turns out i was wrong earlier, I got mixed up somehow - the chaos mover is actually used in the physics example, not sure what happened.
I'm diving into it now if you also want to!
oh yeah it is, well im a little afraid of chaos for now lol
but it is interesting
im trying to figure out how hard it is
Watch this recorded session from Unreal Fest Seattle 2024 in which Yellow Brick Games provides an overview of their physical character controller.
You’ll get insights from the studio’s four-year journey creating action-adventure game 'Eternal Strands', featuring giant creatures that leverage Chaos Physics.
They also discuss the challenge...
this kind of movement is extremely interesting to me
and also I think the chaos vehicles is really cool
Thats good to know! Definitely looking into it at some point.
If you find any useful documentation, or make any cool discovery let me know (:
For this project we decided on cmc, because we want the weapon system in the same prediction system as movement, and i am not familiar enough with how feasible it is with mover.
I would think it would be more feasible with mover than CMC since Mover uses NPP which, afaik, is supposed to be a more general thing
you should 100% look into GMC though if that's your concern, its pricey but well worth it I think
Not if you use the chaos one
rewinding seems to be possible, but as they said its not implemented
Chaos mover is decoupled from NPP
oh right, true. But if you're using CMC, you can't do chaos physics stuff easily anyway can you?
well, in any case, you do you, i wish you luck 🙂
Oh, i definitely know enough about prediction systems to not have to pay for it lol.
I wrote a system to register variables automatically to the cmc system so writing multiplayer logic is almost as easy as single player one
Yeah, physics interaction are gonna be a no go for this game, but fortunately it was not in the scope, more like an extra touch
Next game tho, definitely wanna do something with physics
Oh... thats annoying, i would have imagined it would have been their first concern
They have a pretty good talk about it at Unreal Fest 24
Yeah i remember that one, i just hoped they implemented it by now
Dang you must be a fast worker too then
I hope i can get there someday 🙏
@hexed timber yo yo, what considerations are there for applying instant movement effects and movement modifiers in a predictive way?
Suppose I have a gameplay element that sets a modifier, what would it look like to apply it?
Both should be applied through the QueueInstanceMoveEffect, QueueLayeredMove, Queue... function which will add them to a queued list in the movement mode state machine to be executed as soon as possible (on the next frame) in OnSimulationTick.
You would need to queue them on the local player and the server tho.
It makes sense to link it with a collision component, or through some input flags in the InputCmd
I see, that makes sense - so suppose I had a sprint ability, there's nothing else I'd need to do in terms of timestamping or something like that, just do it locally and then rpc the same function to the server?
Maybe sprint is a bad example but
Some movement ability
That applies an instant effect, whatever that may be
I'd say the best way would be through some flag in the input Cmd, and then having an intermediary listen for that flag to apply the changes
For instance my mover component listens to the sprint flag, and if present, will activate a movement modifier
But when you do this locally + on the server, what does that look like?
Got some velocity forward movement with mover
Looking good, are you using a turn generator for that?
Yeah for the starts and pivots
Playing a bit with "physics" based surfaces (slippery surfaces)
Trampoline-like behavior (only WASD- no spacebar)
I'm trying to figure out the most appropriate place to store a replicated 'Mass' variable
I want the Mass variable to change during runtime, like an inventory system should be allowed to add to it
but i dont' necessarily want to make a sync state for it, as it seems unecessary to replicate all the time
if sync states automatically only replicated deltas, that would be one thing (that's not the case right?), but I don't want to replicate mass if it is remaining the same for 99.99% of frames
and only changing when I adjust my inventory and stuff
anyone have thoughts on this?
can I just do a regular 'on rep' variable on the mover component and set that normally when I equip an item and such?
ive not noticed this pattern anywhere else in mover which is why I was asking, unsure if there is a better pattern that i should stick to
also, any significant difference between having say 3 sync states with 1 variable, or 1 sync state with 3 variables?
(had a call with MajorT - didn't get ignored, posting here for others)
Summary of learning :
-
You can have a component with the input production interface on it, Mover will automatically check for that
-
You can make your input struct, and just pass / add it to input cmd collection.
-
Layered Moves generate proposed moves, which are mixed together and passed into the simulation tick for the current movement mode, which is the final arbiter of what happens. This is probably better than the array of forces sync state.
-
Movement modifiers modify a shared setting value. This is probably better than the mass sync state.