12#include <util/ue-header-guard-begin.h>
13#include "Components/PoseableMeshComponent.h"
14#include "Components/PrimitiveComponent.h"
15#include "Containers/Map.h"
16#include "GameFramework/Character.h"
17#include "GameFramework/CharacterMovementComponent.h"
18#include "GameFramework/Pawn.h"
19#include "Navigation/CrowdFollowingComponent.h"
20#include "Navigation/PathFollowingComponent.h"
21#include <util/ue-header-guard-end.h>
27 : Super(ObjectInitializer.SetDefaultSubobjectClass<UCrowdFollowingComponent>(TEXT(
"PathFollowingComponent")))
29 PrimaryActorTick.bCanEverTick =
true;
34 Super::OnPossess(InPawn);
36 ACharacter *CurrentCharacter = Cast<ACharacter>(InPawn);
37 if (CurrentCharacter ==
nullptr)
39 UE_LOG(LogCarla, Error, TEXT(
"Walker is not a character!"));
43 UCharacterMovementComponent *MovementComponent = CurrentCharacter->GetCharacterMovement();
44 if (MovementComponent ==
nullptr)
46 UE_LOG(LogCarla, Error, TEXT(
"Walker missing character movement component!"));
50 MovementComponent->JumpZVelocity = 500.0f;
51 CurrentCharacter->JumpMaxCount = 2;
68 if (GetCharacter() ==
nullptr)
87 const EPathFollowingRequestResult::Type Result = MoveToLocation(
97 ? TSubclassOf<UNavigationQueryFilter>(UCarlaWalkerCrosserNavFilter::StaticClass())
98 : TSubclassOf<UNavigationQueryFilter>(UCarlaWalkerNavFilter::StaticClass()));
99 if (Result == EPathFollowingRequestResult::Failed)
101 UE_LOG(LogCarla, Warning,
102 TEXT(
"Walker %s: MoveToLocation to (%s) failed (no navmesh under target?)"),
103 *GetName(), *WorldLocation.ToCompactString());
112 ACharacter *CurrentCharacter = GetCharacter();
113 if (CurrentCharacter ==
nullptr)
119 if (
auto *Movement = CurrentCharacter->GetCharacterMovement())
140 ACharacter *CurrentCharacter = GetCharacter();
141 if (CurrentCharacter ==
nullptr)
145 if (
auto *Movement = CurrentCharacter->GetCharacterMovement())
154 Movement->MaxAcceleration = Movement->GetClass()
155 ->GetDefaultObject<UCharacterMovementComponent>()->MaxAcceleration;
166 ACharacter *CurrentCharacter = GetCharacter();
167 if (!CurrentCharacter)
return;
169 TArray<USkeletalMeshComponent *> SkeletalMeshes;
170 CurrentCharacter->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
171 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
172 if (!SkeletalMesh)
return;
175 auto *AnimInst = SkeletalMesh->GetAnimInstance();
176 if (!AnimInst)
return;
177 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
178 if (!WalkerAnim)
return;
181 FPoseSnapshot TempSnapshot;
182 SkeletalMesh->SnapshotPose(TempSnapshot);
187 for (
int i=0; i<TempSnapshot.BoneNames.Num(); ++i)
190 Transforms.
World = SkeletalMesh->GetSocketTransform(TempSnapshot.BoneNames[i], ERelativeTransformSpace::RTS_World);
191 Transforms.
Component = SkeletalMesh->GetSocketTransform(TempSnapshot.BoneNames[i], ERelativeTransformSpace::RTS_Actor);
192 Transforms.
Relative = SkeletalMesh->GetSocketTransform(TempSnapshot.BoneNames[i], ERelativeTransformSpace::RTS_ParentBoneSpace);
195 WalkerBones.BoneTransforms.Add(TempSnapshot.BoneNames[i].ToString(), Transforms);
201 ACharacter* CurrentCharacter = GetCharacter();
202 if (!CurrentCharacter)
return;
204 TArray<USkeletalMeshComponent *> SkeletalMeshes;
205 CurrentCharacter->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
206 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
207 if (!SkeletalMesh)
return;
210 auto *AnimInst = SkeletalMesh->GetAnimInstance();
211 if (!AnimInst)
return;
212 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
213 if (!WalkerAnim)
return;
216 if (WalkerAnim->
Snap.BoneNames.Num() == 0)
219 SkeletalMesh->SnapshotPose(WalkerAnim->
Snap);
222 TMap<FName, FTransform> BonesMap;
223 for (
const TPair<FString, FTransform> &pair :
WalkerBones.BoneTransforms)
225 FName BoneName = FName(*pair.Key);
226 BonesMap.Add(BoneName, pair.Value);
230 for (
int i=0; i<WalkerAnim->
Snap.BoneNames.Num(); ++i)
232 FTransform *Trans = BonesMap.Find(WalkerAnim->
Snap.BoneNames[i]);
235 WalkerAnim->
Snap.LocalTransforms[i] = *Trans;
242 ACharacter* CurrentCharacter = GetCharacter();
243 if (!CurrentCharacter)
return;
245 TArray<USkeletalMeshComponent *> SkeletalMeshes;
246 CurrentCharacter->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
247 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
248 if (!SkeletalMesh)
return;
251 auto *AnimInst = SkeletalMesh->GetAnimInstance();
252 if (!AnimInst)
return;
253 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
254 if (!WalkerAnim)
return;
257 WalkerAnim->
Blend = Blend;
262 ACharacter* CurrentCharacter = GetCharacter();
263 if (!CurrentCharacter)
return;
265 TArray<USkeletalMeshComponent *> SkeletalMeshes;
266 CurrentCharacter->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
267 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
268 if (!SkeletalMesh)
return;
271 auto *AnimInst = SkeletalMesh->GetAnimInstance();
272 if (!AnimInst)
return;
273 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
274 if (!WalkerAnim)
return;
277 SkeletalMesh->SnapshotPose(WalkerAnim->
Snap);
283 Super::Tick(DeltaSeconds);
285 ACharacter* CurrentCharacter = GetCharacter();
286 if (!CurrentCharacter)
return;
299 if (
auto *Movement = CurrentCharacter->GetCharacterMovement())
310 CurrentCharacter->Jump();
bool bNavCrosser
Whether this walker may traverse road/crosswalk nav areas.
bool StartNavigation(bool bIsCrosser=false)
– Server-side navmesh navigation ------------------------------------—
bool StopNavigation()
Abort any navigation request and return to manual control.
void SetNavigationActive(bool bActive)
void Tick(float DeltaSeconds) override
float GetMaximumWalkSpeed() const
Maximum walk speed allowed in centimetres per second.
void ApplyWalkerControl(const FWalkerControl &InControl)
void BlendPose(float Blend)
void SetBonesTransform(const FWalkerBoneControlIn &WalkerBones)
float NavMaxSpeed
Walking speed applied while navigating, cm/s (defaults to the usual pedestrian speed the Python clien...
AWalkerController(const FObjectInitializer &ObjectInitializer)
bool SetNavMaxSpeed(float SpeedCmPerSec)
Walking speed used while navigating, in cm/s.
void GetPoseFromAnimation()
bool GoToNavLocation(const FVector &WorldLocation)
Path-follow to WorldLocation (world-local centimeters) on the navmesh through the crowd following com...
void OnPossess(APawn *InPawn) override
void GetBonesTransform(FWalkerBoneControlOut &WalkerBones)