A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
VRBaseCharacterMovementComponent.h
Go to the documentation of this file.
1// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4#include "CoreMinimal.h"
5#include "Engine/Engine.h"
6#include "VRBPDatatypes.h"
7#include "AITypes.h"
8#include "AI/Navigation/NavigationTypes.h"
9#include "Navigation/PathFollowingComponent.h"
10#include "GameFramework/Character.h"
11#include "GameFramework/CharacterMovementComponent.h"
12#include "Components/SkeletalMeshComponent.h"
14#include "VRBaseCharacterMovementComponent.generated.h"
15
17
18DECLARE_LOG_CATEGORY_EXTERN(LogVRBaseCharacterMovement, Log, All);
19
21DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FVROnPerformClimbingStepUp, FVector, FinalStepUpLocation);
22
23/*
24* The base class for our VR characters, contains common logic across them, not to be used directly
25*/
26UCLASS()
27class VREXPANSIONPLUGIN_API UVRBaseCharacterMovementComponent : public UCharacterMovementComponent
28{
30public:
32 UVRBaseCharacterMovementComponent(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());
33
35 FVRCharacterNetworkMoveDataContainer VRNetworkMoveDataContainer;
36 FVRCharacterMoveResponseDataContainer VRMoveResponseDataContainer;
38 bool bNotifyTeleported;
39
41 UPROPERTY(Transient, DuplicateTransient)
42 AVRBaseCharacter* BaseVRCharacterOwner;
43
44 virtual void SetUpdatedComponent(USceneComponent* NewUpdatedComponent);
45
46 virtual void MoveAutonomous(float ClientTimeStamp, float DeltaTime, uint8 CompressedFlags, const FVector& NewAccel) override;
47 virtual void PerformMovement(float DeltaSeconds) override;
48 //virtual void ReplicateMoveToServer(float DeltaTime, const FVector& NewAcceleration) override;
49
50 // Overriding this to run the seated logic
51 virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction) override;
52
53 // Skip force updating position if we are seated.
54 virtual bool ForcePositionUpdate(float DeltaTime) override;
55
56 // When true will use the default engines behavior of setting rotation to match the clients instead of simulating rotations, this is really only here for FPS test pawns
57 // And non VRCharacter classes (simple character will use this)
58 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRBaseCharacterMovementComponent")
59 bool bUseClientControlRotation;
60
61 // When true remote proxies will no longer attempt to estimate player moves when motion smoothing is enabled.
62 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRBaseCharacterMovementComponent|Smoothing")
63 bool bDisableSimulatedTickWhenSmoothingMovement;
64
65 // When true the hmd movement injection speed is capped to the maximum movement speed
66 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
67 bool bCapHMDMovementToMaxMovementSpeed;
68
69 // Adding seated transition
70 void OnMovementModeChanged(EMovementMode PreviousMovementMode, uint8 PreviousCustomMode) override;
71
72 // Called when a valid climbing step up movement is found, if bound to the default auto step up is not performed to let custom step up logic happen instead.
73 UPROPERTY(BlueprintAssignable, Category = "VRMovement")
74 FVROnPerformClimbingStepUp OnPerformClimbingStepUp;
75
76 virtual void OnMoveCompleted(FAIRequestID RequestID, const FPathFollowingResult& Result);
78 // Can't be inline anymore
79 FVector GetActorFeetLocationVR() const;
80
81 FORCEINLINE bool HasRequestedVelocity()
82 {
83 return bHasRequestedVelocity;
84 }
86 void SetHasRequestedVelocity(bool bNewHasRequestedVelocity);
87 bool IsClimbing() const;
88
89 // Sets the crouching half height since it isn't exposed during runtime to blueprints
90 UFUNCTION(BlueprintCallable, Category = "VRMovement")
91 void SetCrouchedHalfHeight(float NewCrouchedHalfHeight);
92
93 // Setting this higher will divide the wall slide effect by this value, to reduce collision sliding.
94 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement", meta = (ClampMin = "0.0", UIMin = "0", ClampMax = "5.0", UIMax = "5"))
95 float VRWallSlideScaler;
96
98 virtual float SlideAlongSurface(const FVector& Delta, float Time, const FVector& Normal, FHitResult& Hit, bool bHandleImpact) override;
99
100 // Add in the custom replicated movement that climbing mode uses, this is a cutom vector that is applied to character movements
101 // on the next tick as a movement input..
102 UFUNCTION(BlueprintCallable, Category = "BaseVRCharacterMovementComponent|VRLocations")
103 void AddCustomReplicatedMovement(FVector Movement);
104
105 // Clears the custom replicated movement, can be used to cancel movements if the mode changes
106 UFUNCTION(BlueprintCallable, Category = "BaseVRCharacterMovementComponent|VRLocations")
107 void ClearCustomReplicatedMovement();
108
109 // Called to check if the server is performing a move action on a non controlled character
110 // If so then we just run the logic right away as it can't be inlined and won't be replicated
111 void CheckServerAuthedMoveAction();
112
113 // Set tracking paused for our root capsule and replicate the location to all connections
114 UFUNCTION(BlueprintCallable, Category = "VRMovement")
115 void PerformMoveAction_SetTrackingPaused(bool bNewTrackingPaused);
116 virtual void StoreSetTrackingPaused(bool bNewTrackingPaused);
117
118 // Perform a snap turn in line with the move action system
119 UFUNCTION(BlueprintCallable, Category = "VRMovement")
120 void PerformMoveAction_SnapTurn(float SnapTurnDeltaYaw, EVRMoveActionVelocityRetention VelocityRetention = EVRMoveActionVelocityRetention::VRMOVEACTION_Velocity_None, bool bFlagGripTeleport = false, bool bFlagCharacterTeleport = false);
121
122 // Perform a rotation set in line with the move actions system
123 // This node specifically sets the FACING direction to a value, where your HMD is pointed
124 UFUNCTION(BlueprintCallable, Category = "VRMovement")
125 void PerformMoveAction_SetRotation(float NewYaw, EVRMoveActionVelocityRetention VelocityRetention = EVRMoveActionVelocityRetention::VRMOVEACTION_Velocity_None, bool bFlagGripTeleport = false, bool bFlagCharacterTeleport = false);
126
127 // Perform a teleport in line with the move action system
128 UFUNCTION(BlueprintCallable, Category = "VRMovement")
129 void PerformMoveAction_Teleport(FVector TeleportLocation, FRotator TeleportRotation, EVRMoveActionVelocityRetention VelocityRetention = EVRMoveActionVelocityRetention::VRMOVEACTION_Velocity_None, bool bSkipEncroachmentCheck = false);
130
131 // Perform StopAllMovementImmediately in line with the move action system
132 UFUNCTION(BlueprintCallable, Category = "VRMovement")
133 void PerformMoveAction_StopAllMovement();
134
135 // Perform a custom moveaction that you define, will call the OnCustomMoveActionPerformed event in the character when processed so you can run your own logic
136 // Be sure to set the minimum data replication requirements for your move action in order to save on replication.
137 // Flags will always replicate if it is non zero
138 UFUNCTION(BlueprintCallable, Category = "VRMovement")
139 void PerformMoveAction_Custom(EVRMoveAction MoveActionToPerform, EVRMoveActionDataReq DataRequirementsForMoveAction, FVector MoveActionVector, FRotator MoveActionRotator, uint8 MoveActionFlags = 0);
140
141 FVRMoveActionArray MoveActionArray;
142
143 bool CheckForMoveAction();
144 virtual bool DoMASnapTurn(FVRMoveActionContainer& MoveAction);
145 virtual bool DoMASetRotation(FVRMoveActionContainer& MoveAction);
146 virtual bool DoMATeleport(FVRMoveActionContainer& MoveAction);
147 virtual bool DoMAStopAllMovement(FVRMoveActionContainer& MoveAction);
148 virtual bool DoMAPauseTracking(FVRMoveActionContainer& MoveAction);
149
150 FVector CustomVRInputVector;
151 FVector AdditionalVRInputVector;
152 FVector LastPreAdditiveVRVelocity;
153 bool bHadExtremeInput;
154 bool bApplyAdditionalVRInputVectorAsNegative;
155
156 // Rewind the relative movement that we had with the HMD
157 inline void RewindVRRelativeMovement()
158 {
159 if (bApplyAdditionalVRInputVectorAsNegative)
160 {
161 //FHitResult AHit;
162 MoveUpdatedComponent(-AdditionalVRInputVector, UpdatedComponent->GetComponentQuat(), false);
163 //SafeMoveUpdatedComponent(-AdditionalVRInputVector, UpdatedComponent->GetComponentQuat(), false, AHit);
164 }
165 }
166
167 // Any movement above this value we will consider as have been a tracking jump and null out the movement in the character
168 // Raise this value higher if players are noticing freezing when moving quickly.
169 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement", meta = (ClampMin = "0.0", UIMin = "0"))
170 float TrackingLossThreshold;
171
172 // If we hit the tracking loss threshold then rewind position instead of running to the new location
173 // Will force the HMD to stay in its original spot prior to the tracking jump
174 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
175 bool bHoldPositionOnTrackingLossThresholdHit;
176
177 // Rewind the relative movement that we had with the HMD, this is exposed to Blueprint so that custom movement modes can use it to rewind prior to movement actions.
178 // Returns the Vector required to get back to the original position (for custom movement modes)
179 UFUNCTION(BlueprintCallable, Category = "VRMovement")
180 FVector RewindVRMovement();
181
182 // Gets the current CustomInputVector for use in custom movement modes
183 UFUNCTION(BlueprintCallable, Category = "VRMovement")
184 FVector GetCustomInputVector();
185
186 bool bWasInPushBack;
187 bool bIsInPushBack;
188 void StartPushBackNotification(FHitResult HitResult);
189 void EndPushBackNotification();
190
191 bool bJustUnseated;
192
193 //virtual void SendClientAdjustment() override;
194
195 virtual bool VerifyClientTimeStamp(float TimeStamp, FNetworkPredictionData_Server_Character & ServerData) override;
196
197 inline void ApplyVRMotionToVelocity(float deltaTime)
198 {
199 bHadExtremeInput = false;
200
201 if (AdditionalVRInputVector.IsNearlyZero() && CustomVRInputVector.IsNearlyZero())
203 LastPreAdditiveVRVelocity = FVector::ZeroVector;
204 return;
207 LastPreAdditiveVRVelocity = (AdditionalVRInputVector / deltaTime); // Save off pre-additive Velocity for restoration next tick
208
209 if (LastPreAdditiveVRVelocity.SizeSquared() > FMath::Square(TrackingLossThreshold))
210 {
211 bHadExtremeInput = true;
212 if (bHoldPositionOnTrackingLossThresholdHit)
213 {
214 LastPreAdditiveVRVelocity = FVector::ZeroVector;
215 }
216 }
217
218 // Post the HMD velocity checks, add in our direct movement now
219 LastPreAdditiveVRVelocity += (CustomVRInputVector / deltaTime);
220
221 Velocity += LastPreAdditiveVRVelocity;
222
223 if (bCapHMDMovementToMaxMovementSpeed && GetReplicatedMovementMode() != EVRConjoinedMovementModes::C_MOVE_Falling)
224 {
225 if (IsExceedingMaxSpeed(GetMaxSpeed()))
227 // Force us to the max possible speed for the movement mode
228 Velocity = Velocity.GetSafeNormal() * GetMaxSpeed();
229 }
230 }
231
232 }
233
234 inline void RestorePreAdditiveVRMotionVelocity()
236 if (!LastPreAdditiveVRVelocity.IsNearlyZero())
237 {
238 if (bHadExtremeInput)
239 {
240 // Just zero out the velocity here
241 Velocity = FVector::ZeroVector;
242 }
243 else
244 {
245 // This doesn't work with input in the opposing direction
246 /*FVector ProjectedVelocity = Velocity.ProjectOnToNormal(LastPreAdditiveVRVelocity.GetSafeNormal());
247 float VelSq = ProjectedVelocity.SizeSquared();
248 float AddSq = LastPreAdditiveVRVelocity.SizeSquared();
249
250 if (VelSq > AddSq || ProjectedVelocity.Equals(LastPreAdditiveVRVelocity, 0.1f))
251 {
252 // Subtract velocity if we still relatively retain it in the normalized direction
253 Velocity -= LastPreAdditiveVRVelocity;
254 }*/
255
256 Velocity -= LastPreAdditiveVRVelocity;
258 }
259
260 LastPreAdditiveVRVelocity = FVector::ZeroVector;
261 }
262
263 virtual void PhysCustom(float deltaTime, int32 Iterations) override;
264 virtual void PhysCustom_Climbing(float deltaTime, int32 Iterations);
265 virtual void PhysCustom_LowGrav(float deltaTime, int32 Iterations);
266
267 // Teleport grips on correction to fixup issues
268 virtual void OnClientCorrectionReceived(class FNetworkPredictionData_Client_Character& ClientData, float TimeStamp, FVector NewLocation, FVector NewVelocity, UPrimitiveComponent* NewBase, FName NewBaseBoneName, bool bHasBase, bool bBaseRelativePosition, uint8 ServerMovementMode) override;
269
270 // Fix network smoothing with our default mesh back in
271 virtual void SimulatedTick(float DeltaSeconds) override;
272
273 // Skip updates with rotational differences
274 virtual void SmoothCorrection(const FVector& OldLocation, const FQuat& OldRotation, const FVector& NewLocation, const FQuat& NewRotation) override;
275
282 virtual void SmoothClientPosition(float DeltaSeconds) override;
283
285 void SmoothClientPosition_UpdateVRVisuals();
286
287 // Added in 4.16
289 //virtual void HandleSwimmingWallHit(const FHitResult& Hit, float DeltaTime);
290
291 // If true will never count a physicsbody channel component as the floor, to prevent jitter / physics problems.
292 // Make sure that you set simulating objects to the physics body channel if you want this to work correctly
293 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
294 bool bIgnoreSimulatingComponentsInFloorCheck;
295
296 // If true will run the control rotation in the CMC instead of in the player controller
297 // This puts the player rotation into the scoped movement (perf savings) and also ensures it is properly rotated prior to movement
298 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
299 bool bRunControlRotationInMovementComponent;
301 // Moved into compute floor dist
302 // Option to Skip simulating components when looking for floor
303 /*virtual bool FloorSweepTest(
304 const FVector& Start,
305 FHitResult& OutHit,
306 const FVector& End,
307 ECollisionChannel TraceChannel,
308 const struct FCollisionShape& CollisionShape,
309 const struct FCollisionQueryParams& Params,
310 const struct FCollisionResponseParams& ResponseParam
311 ) const override;*/
312
313 virtual void ComputeFloorDist(const FVector& CapsuleLocation, float LineDistance, float SweepDistance, FFindFloorResult& OutFloorResult, float SweepRadius, const FHitResult* DownwardSweepResult = NULL) const override;
314
315 // Need to use actual capsule location for step up
316 virtual bool VRClimbStepUp(const FVector& GravDir, const FVector& Delta, const FHitResult &InHit, FStepDownResult* OutStepDownResult = nullptr);
317
318 // Height to auto step up
319 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
320 float VRClimbingStepHeight;
321
322 /* Custom distance that is required before accepting a climbing stepup
323 * This is to help with cases where head wobble causes falling backwards
324 * Do NOT set to larger than capsule radius!
325 * #TODO: Port to SimpleCharacter as well
326 */
327 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
328 float VRClimbingEdgeRejectDistance;
329
330 // Higher values make it easier to trigger a step up onto a platform and moves you farther in to the base *DEFUNCT*
331 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
332 float VRClimbingStepUpMultiplier;
333
334 // If true will clamp the maximum movement on climbing step up to: VRClimbingStepUpMaxSize
335 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
336 bool bClampClimbingStepUp;
337
338 // Maximum X/Y vector size to use when climbing stepping up (prevents very deep step ups from large movements).
339 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
340 float VRClimbingStepUpMaxSize;
341
342 // If true will automatically set falling when a stepup occurs during climbing
343 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
344 bool SetDefaultPostClimbMovementOnStepUp;
345
346 // Max velocity on releasing a climbing grip
347 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
348 float VRClimbingMaxReleaseVelocitySize;
349
350 /* Custom distance that is required before accepting a walking stepup
351 * This is to help promote stepping up, engine default is 0.15f, generally you want it lower than that
352 * Do NOT set to larger than capsule radius!
353 * #TODO: Port to SimpleCharacter as well
354 */
355 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
356 float VREdgeRejectDistance;
357
358 UFUNCTION(BlueprintCallable, Category = "VRMovement|Climbing")
359 void SetClimbingMode(bool bIsClimbing);
360
361 // Default movement mode to switch to post climb ended, only used if SetDefaultPostClimbMovementOnStepUp is true
362 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
363 EVRConjoinedMovementModes DefaultPostClimbMovement;
365 // Overloading this to handle an edge case
366 virtual void ApplyNetworkMovementMode(const uint8 ReceivedMode) override;
367
368 /*
369 * This is called client side to make a replicated movement mode change that hits the server in the saved move.
370 *
371 * Custom Movement Mode is currently limited to 0 - 8, the index's 0 and 1 are currently used up for the plugin movement modes.
372 * So setting it to 0 or 1 would be Climbing, and LowGrav respectivly, this leaves 2-8 as open index's for use.
373 * For a total of 6 Custom movement modes past the currently implemented plugin ones.
374 */
375 UFUNCTION(BlueprintCallable, Category = "VRMovement")
376 void SetReplicatedMovementMode(EVRConjoinedMovementModes NewMovementMode);
377
378 /*
379 * Call this to convert the current movement mode to a Conjoined one for reference
380 *
381 * Custom Movement Mode is currently limited to 0 - 8, the index's 0 and 1 are currently used up for the plugin movement modes.
382 * So setting it to 0 or 1 would be Climbing, and LowGrav respectivly, this leaves 2-8 as open index's for use.
383 * For a total of 6 Custom movement modes past the currently implemented plugin ones.
384 */
385 UFUNCTION(BlueprintPure, Category = "VRMovement")
386 EVRConjoinedMovementModes GetReplicatedMovementMode();
387
388 // We use 4 bits for this so a maximum of 16 elements
389 EVRConjoinedMovementModes VRReplicatedMovementMode;
390
391 FORCEINLINE void ApplyReplicatedMovementMode(EVRConjoinedMovementModes &NewMovementMode, bool bClearMovementMode = false)
392 {
393 if (NewMovementMode != EVRConjoinedMovementModes::C_MOVE_MAX)//None)
394 {
395 if (NewMovementMode <= EVRConjoinedMovementModes::C_MOVE_MAX)
396 {
397 // Is a default movement mode, just directly set it
398 SetMovementMode((EMovementMode)NewMovementMode);
399 }
400 else // Is Custom
401 {
402 // Auto calculates the difference for our VR movements, index is from 0 so using climbing should get me correct index's as it is the first custom mode
403 SetMovementMode(EMovementMode::MOVE_Custom, (((int8)NewMovementMode - (uint8)EVRConjoinedMovementModes::C_VRMOVE_Climbing)));
404 }
405
406 // Clearing it here instead now, as this way the code can inject it during PerformMovement
407 // Specifically used by the Climbing Step up, so that server rollbacks are supported
408 if(bClearMovementMode)
409 NewMovementMode = EVRConjoinedMovementModes::C_MOVE_MAX;//None;
411 }
412
413 void UpdateFromCompressedFlags(uint8 Flags) override;
414
415 FVector RoundDirectMovement(FVector InMovement) const;
416
417 // Setting this below 1.0 will change how fast you de-accelerate when touching a wall
418 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|LowGrav", meta = (ClampMin = "0.0", UIMin = "0", ClampMax = "5.0", UIMax = "5"))
419 float VRLowGravWallFrictionScaler;
420
421 // If true then low grav will ignore the default physics volume fluid friction, useful if you have a mix of low grav and normal movement
422 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|LowGrav")
423 bool VRLowGravIgnoresDefaultFluidFriction;
424};
425
EVRMoveActionVelocityRetention
UENUM(Blueprintable)
EVRMoveActionDataReq
UENUM(Blueprintable)
EVRMoveAction
UENUM(Blueprintable)
EVRConjoinedMovementModes
UENUM(BlueprintType)
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FVROnPerformClimbingStepUp, FVector, FinalStepUpLocation)
DECLARE_LOG_CATEGORY_EXTERN(LogVRBaseCharacterMovement, Log, All)
float VRClimbingStepUpMaxSize
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
float VRClimbingEdgeRejectDistance
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
float VRClimbingStepUpMultiplier
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
float VRLowGravWallFrictionScaler
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|LowGrav", meta = (ClampMin = "0....
bool bCapHMDMovementToMaxMovementSpeed
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
FVROnPerformClimbingStepUp OnPerformClimbingStepUp
UPROPERTY(BlueprintAssignable, Category = "VRMovement")
float VRClimbingStepHeight
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
bool SetDefaultPostClimbMovementOnStepUp
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
bool bIgnoreSimulatingComponentsInFloorCheck
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
FVRCharacterNetworkMoveDataContainer VRNetworkMoveDataContainer
FVRCharacterMoveResponseDataContainer VRMoveResponseDataContainer
AVRBaseCharacter * BaseVRCharacterOwner
UPROPERTY(Transient, DuplicateTransient)
bool bHoldPositionOnTrackingLossThresholdHit
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
EVRConjoinedMovementModes DefaultPostClimbMovement
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
FORCEINLINE void ApplyReplicatedMovementMode(EVRConjoinedMovementModes &NewMovementMode, bool bClearMovementMode=false)
float VRWallSlideScaler
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement", meta = (ClampMin = "0....
bool bUseClientControlRotation
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRBaseCharacterMovementComponent")
bool bDisableSimulatedTickWhenSmoothingMovement
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRBaseCharacterMovementComponent|Smoothing")
bool VRLowGravIgnoresDefaultFluidFriction
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|LowGrav")
float VREdgeRejectDistance
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
bool bRunControlRotationInMovementComponent
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement")
bool bClampClimbingStepUp
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
float VRClimbingMaxReleaseVelocitySize
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement|Climbing")
float TrackingLossThreshold
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "VRMovement", meta = (ClampMin = "0....