From d9faa65a2714fdcf8d1e7d3d11e38bb2d7025c7c Mon Sep 17 00:00:00 2001 From: cit110 <840418418@qq.com> Date: Sun, 26 Apr 2026 16:15:14 +0800 Subject: [PATCH] Fix class visual mesh initialization --- Config/DefaultPHYClass.ini | 2 +- .../Animation/PHYCharacterMeshBridgeComponent.cpp | 5 ++++- Source/PHY/Private/Characters/PHYCharacterBase.cpp | 13 +++++++++---- Source/PHY/Private/Class/PHYClassComponent.cpp | 8 +++++++- Source/PHY/Public/Characters/PHYCharacterBase.h | 3 +++ 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Config/DefaultPHYClass.ini b/Config/DefaultPHYClass.ini index cba96f8..71c97fa 100644 --- a/Config/DefaultPHYClass.ini +++ b/Config/DefaultPHYClass.ini @@ -4,7 +4,7 @@ DefaultAIClassTag=(TagName="Class.Saber") bApplyPlayerClassMeshToPlayers=True bApplyPlayerClassMeshToAI=False !PlayerClassMeshes=ClearArray -+PlayerClassMeshes=(ClassTag=(TagName="Class.Saber"),PlayerMesh=None,PlayerRetargeter=) ++PlayerClassMeshes=(ClassTag=(TagName="Class.Saber"),PlayerMesh="/Game/AGame/Character/Ida/SK_MMO_ADVANCED_F_01_AGame.SK_MMO_ADVANCED_F_01_AGame",PlayerRetargeter="/Game/AGame/Animation/Retargeters/RTG_Manny_To_Ida.RTG_Manny_To_Ida") +PlayerClassMeshes=(ClassTag=(TagName="Class.Lancer"),PlayerMesh=None,PlayerRetargeter=) +PlayerClassMeshes=(ClassTag=(TagName="Class.Archer"),PlayerMesh=None,PlayerRetargeter=) +PlayerClassMeshes=(ClassTag=(TagName="Class.Rider"),PlayerMesh=None,PlayerRetargeter=) diff --git a/Source/PHY/Private/Animation/PHYCharacterMeshBridgeComponent.cpp b/Source/PHY/Private/Animation/PHYCharacterMeshBridgeComponent.cpp index 890776e..6c2e002 100644 --- a/Source/PHY/Private/Animation/PHYCharacterMeshBridgeComponent.cpp +++ b/Source/PHY/Private/Animation/PHYCharacterMeshBridgeComponent.cpp @@ -36,7 +36,10 @@ void UPHYCharacterMeshBridgeComponent::InitializeMeshBridge(ACharacter* Characte ApplySourceDefaults(); const UPHYAnimationSettings* Settings = GetDefault(); - CurrentRetargeter = Settings ? Settings->DefaultIKRetargeter : FSoftObjectPath(); + if (!CurrentRetargeter.IsValid()) + { + CurrentRetargeter = Settings ? Settings->DefaultIKRetargeter : FSoftObjectPath(); + } if (Settings) { diff --git a/Source/PHY/Private/Characters/PHYCharacterBase.cpp b/Source/PHY/Private/Characters/PHYCharacterBase.cpp index 39ba2f4..aa47392 100644 --- a/Source/PHY/Private/Characters/PHYCharacterBase.cpp +++ b/Source/PHY/Private/Characters/PHYCharacterBase.cpp @@ -91,16 +91,21 @@ void APHYCharacterBase::PreInitializeComponents() UGameFrameworkComponentManager::AddGameFrameworkComponentReceiver(this); } -void APHYCharacterBase::BeginPlay() +void APHYCharacterBase::PostInitializeComponents() { - Super::BeginPlay(); - - ApplyCharacterSettings(); + Super::PostInitializeComponents(); if (MeshBridgeComponent) { MeshBridgeComponent->InitializeMeshBridge(this, DisplayMeshComponent); } +} + +void APHYCharacterBase::BeginPlay() +{ + Super::BeginPlay(); + + ApplyCharacterSettings(); if (RagdollComponent) { diff --git a/Source/PHY/Private/Class/PHYClassComponent.cpp b/Source/PHY/Private/Class/PHYClassComponent.cpp index 69b9455..deaedb2 100644 --- a/Source/PHY/Private/Class/PHYClassComponent.cpp +++ b/Source/PHY/Private/Class/PHYClassComponent.cpp @@ -133,7 +133,13 @@ bool UPHYClassComponent::ApplyConfiguredPlayerMeshIfAllowed(AActor* AvatarActor) const FSoftObjectPath PlayerRetargeter = GetConfiguredPlayerRetargeter(); UPHYCharacterMeshBridgeComponent* MeshBridge = Character->GetMeshBridgeComponent(); - return MeshBridge ? MeshBridge->ApplyDisplayMesh(PlayerMesh, nullptr, PlayerRetargeter) : false; + if (!MeshBridge) + { + return false; + } + + MeshBridge->InitializeMeshBridge(Character, Character->GetDisplayMeshComponent()); + return MeshBridge->ApplyDisplayMesh(PlayerMesh, nullptr, PlayerRetargeter); } bool UPHYClassComponent::ApplyClassAttributesToAbilitySystem(UAbilitySystemComponent* AbilitySystemComponent) const diff --git a/Source/PHY/Public/Characters/PHYCharacterBase.h b/Source/PHY/Public/Characters/PHYCharacterBase.h index c8482ef..b9c2fec 100644 --- a/Source/PHY/Public/Characters/PHYCharacterBase.h +++ b/Source/PHY/Public/Characters/PHYCharacterBase.h @@ -41,6 +41,9 @@ public: /** @brief 注册 ModularGameplay 组件接收者。 */ virtual void PreInitializeComponents() override; + /** @brief 在 Possess 和 PlayerState 初始化前绑定显示层 Mesh 桥接组件。 */ + virtual void PostInitializeComponents() override; + /** @brief 初始化角色运行时组件。 */ virtual void BeginPlay() override;