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