Fix retarget display mesh initialization
This commit is contained in:
@@ -18,6 +18,14 @@ UPHYCharacterMeshBridgeComponent::UPHYCharacterMeshBridgeComponent(const FObject
|
||||
PrimaryComponentTick.bCanEverTick = false;
|
||||
}
|
||||
|
||||
void UPHYCharacterMeshBridgeComponent::BeginPlay()
|
||||
{
|
||||
Super::BeginPlay();
|
||||
|
||||
// 构造期或 PlayerState 职业同步可能早于显示 Mesh 注册,运行时再确认一次。
|
||||
RefreshFollowPoseMode();
|
||||
}
|
||||
|
||||
void UPHYCharacterMeshBridgeComponent::InitializeMeshBridge(ACharacter* Character, USkeletalMeshComponent* InDisplayMeshComponent)
|
||||
{
|
||||
SourceMeshComponent = Character ? Character->GetMesh() : nullptr;
|
||||
@@ -185,6 +193,16 @@ void UPHYCharacterMeshBridgeComponent::ConfigureRetargetFollowPose()
|
||||
return;
|
||||
}
|
||||
|
||||
if (!DisplayMeshComponent->GetSkeletalMeshAsset())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!SourceMeshComponent->IsRegistered() || !DisplayMeshComponent->IsRegistered())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
TSubclassOf<UAnimInstance> RetargetAnimClass = ResolveRetargetDisplayAnimClass();
|
||||
if (!RetargetAnimClass)
|
||||
{
|
||||
@@ -204,6 +222,8 @@ void UPHYCharacterMeshBridgeComponent::ConfigureRetargetFollowPose()
|
||||
DisplayMeshComponent->SetAnimInstanceClass(RetargetAnimClass);
|
||||
}
|
||||
|
||||
DisplayMeshComponent->InitAnim(true);
|
||||
|
||||
if (!CurrentRetargeter.IsValid())
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("PHYCharacterMeshBridgeComponent: DisplayMesh %s needs an IK Retargeter for cross-skeleton follow pose."), *GetNameSafe(DisplayMeshComponent));
|
||||
@@ -213,7 +233,10 @@ void UPHYCharacterMeshBridgeComponent::ConfigureRetargetFollowPose()
|
||||
UPHYRetargetPoseAnimInstance* RetargetAnimInstance = Cast<UPHYRetargetPoseAnimInstance>(DisplayMeshComponent->GetAnimInstance());
|
||||
if (!RetargetAnimInstance)
|
||||
{
|
||||
UE_LOG(LogTemp, Warning, TEXT("PHYCharacterMeshBridgeComponent: DisplayMesh %s did not create a UPHYRetargetPoseAnimInstance."), *GetNameSafe(DisplayMeshComponent));
|
||||
UE_LOG(LogTemp, Warning, TEXT("PHYCharacterMeshBridgeComponent: DisplayMesh %s did not create a UPHYRetargetPoseAnimInstance. AnimClass=%s AnimInstance=%s"),
|
||||
*GetNameSafe(DisplayMeshComponent),
|
||||
*GetNameSafe(DisplayMeshComponent->GetAnimClass()),
|
||||
*GetNameSafe(DisplayMeshComponent->GetAnimInstance()));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,9 @@ public:
|
||||
FSoftObjectPath GetCurrentRetargeter() const { return CurrentRetargeter; }
|
||||
|
||||
protected:
|
||||
/** @brief 组件进入运行时后重新确认 Follow Pose 模式,覆盖构造期组件未注册的情况。 */
|
||||
virtual void BeginPlay() override;
|
||||
|
||||
/** @brief 应用配置中的源运动 Mesh 和 AnimClass 默认值。 */
|
||||
void ApplySourceDefaults();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user