16#include "Components/PoseableMeshComponent.h"
19#include "Components/PrimitiveComponent.h"
22#include "Containers/Map.h"
23#include "GameFramework/Character.h"
24#include "GameFramework/CharacterMovementComponent.h"
28#include "GameFramework/Pawn.h"
33 : Super(ObjectInitializer)
36 PrimaryActorTick.bCanEverTick =
true;
44 Super::OnPossess(InPawn);
46 auto *
Character = Cast<ACharacter>(InPawn);
49 UE_LOG(LogCarla, Error, TEXT(
"Walker is not a character!"));
53 auto *MovementComponent =
Character->GetCharacterMovement();
54 if (MovementComponent ==
nullptr)
56 UE_LOG(LogCarla, Error, TEXT(
"Walker missing character movement component!"));
62 MovementComponent->JumpZVelocity = 500.0f;
76 TArray<USkeletalMeshComponent *> SkeletalMeshes;
77 Character->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
78 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
79 if (!SkeletalMesh)
return;
82 auto *AnimInst = SkeletalMesh->GetAnimInstance();
83 if (!AnimInst)
return;
84 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
85 if (!WalkerAnim)
return;
88 FPoseSnapshot TempSnapshot;
89 SkeletalMesh->SnapshotPose(TempSnapshot);
94 for (
int i=0; i<TempSnapshot.BoneNames.Num(); ++i)
97 Transforms.
World = SkeletalMesh->GetSocketTransform(TempSnapshot.BoneNames[i], ERelativeTransformSpace::RTS_World);
98 Transforms.
Component = SkeletalMesh->GetSocketTransform(TempSnapshot.BoneNames[i], ERelativeTransformSpace::RTS_Actor);
99 Transforms.
Relative = SkeletalMesh->GetSocketTransform(TempSnapshot.BoneNames[i], ERelativeTransformSpace::RTS_ParentBoneSpace);
102 WalkerBones.BoneTransforms.Add(TempSnapshot.BoneNames[i].ToString(), Transforms);
111 TArray<USkeletalMeshComponent *> SkeletalMeshes;
112 Character->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
113 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
114 if (!SkeletalMesh)
return;
117 auto *AnimInst = SkeletalMesh->GetAnimInstance();
118 if (!AnimInst)
return;
119 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
120 if (!WalkerAnim)
return;
123 if (WalkerAnim->
Snap.BoneNames.Num() == 0)
126 SkeletalMesh->SnapshotPose(WalkerAnim->
Snap);
129 TMap<FName, FTransform> BonesMap;
130 for (
const TPair<FString, FTransform> &pair :
WalkerBones.BoneTransforms)
132 FName BoneName = FName(*pair.Key);
133 BonesMap.Add(BoneName, pair.Value);
137 for (
int i=0; i<WalkerAnim->
Snap.BoneNames.Num(); ++i)
139 FTransform *Trans = BonesMap.Find(WalkerAnim->
Snap.BoneNames[i]);
142 WalkerAnim->
Snap.LocalTransforms[i] = *Trans;
152 TArray<USkeletalMeshComponent *> SkeletalMeshes;
153 Character->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
154 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
155 if (!SkeletalMesh)
return;
158 auto *AnimInst = SkeletalMesh->GetAnimInstance();
159 if (!AnimInst)
return;
160 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
161 if (!WalkerAnim)
return;
164 WalkerAnim->
Blend = Blend;
172 TArray<USkeletalMeshComponent *> SkeletalMeshes;
173 Character->GetComponents<USkeletalMeshComponent>(SkeletalMeshes,
false);
174 USkeletalMeshComponent *SkeletalMesh = SkeletalMeshes.IsValidIndex(0) ? SkeletalMeshes[0] :
nullptr;
175 if (!SkeletalMesh)
return;
178 auto *AnimInst = SkeletalMesh->GetAnimInstance();
179 if (!AnimInst)
return;
180 UWalkerAnim *WalkerAnim = Cast<UWalkerAnim>(AnimInst);
181 if (!WalkerAnim)
return;
184 SkeletalMesh->SnapshotPose(WalkerAnim->
Snap);
194 Super::Tick(DeltaSeconds);
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
void Tick(float DeltaSeconds) override
float GetMaximumWalkSpeed() const
允许的最大步行速度(以厘米/秒为单位)。
void ApplyWalkerControl(const FWalkerControl &InControl)
void BlendPose(float Blend)
void SetBonesTransform(const FWalkerBoneControlIn &WalkerBones)
AWalkerController(const FObjectInitializer &ObjectInitializer)
void GetPoseFromAnimation()
void OnPossess(APawn *InPawn) override
void GetBonesTransform(FWalkerBoneControlOut &WalkerBones)