diff --git a/Config/DefaultPHYCharacter.ini b/Config/DefaultPHYCharacter.ini index e88125d..d3c4b2c 100644 --- a/Config/DefaultPHYCharacter.ini +++ b/Config/DefaultPHYCharacter.ini @@ -4,6 +4,8 @@ bEnableContextEffects=True DefaultMaxWalkSpeed=500.000000 DefaultSprintSpeed=650.000000 DefaultMaxAcceleration=2048.000000 +DefaultMeshRelativeLocation=(X=0.000000,Y=0.000000,Z=-90.000000) +DefaultMeshRelativeRotation=(Pitch=0.000000,Yaw=-90.000000,Roll=0.000000) DefaultInteractionOption=0 DefaultPlayerCharacterClass="/Game/AGame/Character/Player/BP_PlayerBase.BP_PlayerBase_C" DefaultAICharacterClass="/Game/AGame/Character/AI/BP_AIBase.BP_AIBase_C" diff --git a/Source/PHY/Private/Characters/PHYCharacterBase.cpp b/Source/PHY/Private/Characters/PHYCharacterBase.cpp index aa47392..d3b6e76 100644 --- a/Source/PHY/Private/Characters/PHYCharacterBase.cpp +++ b/Source/PHY/Private/Characters/PHYCharacterBase.cpp @@ -32,6 +32,13 @@ APHYCharacterBase::APHYCharacterBase(const FObjectInitializer& ObjectInitializer { bReplicates = true; + const UPHYCharacterSettings* CharacterSettings = GetDefault(); + if (USkeletalMeshComponent* SourceMeshComponent = GetMesh()) + { + SourceMeshComponent->SetRelativeLocation(CharacterSettings ? CharacterSettings->DefaultMeshRelativeLocation : FVector(0.0f, 0.0f, -90.0f)); + SourceMeshComponent->SetRelativeRotation(CharacterSettings ? CharacterSettings->DefaultMeshRelativeRotation : FRotator(0.0f, -90.0f, 0.0f)); + } + CharacterStateComponent = CreateDefaultSubobject(TEXT("CharacterStateComponent")); CombatSystemComponent = CreateDefaultSubobject(TEXT("CombatSystemComponent")); TargetingSystemComponent = CreateDefaultSubobject(TEXT("TargetingSystemComponent")); @@ -80,6 +87,8 @@ APHYCharacterBase::APHYCharacterBase(const FObjectInitializer& ObjectInitializer DisplayMeshComponent = CreateDefaultSubobject(TEXT("DisplayMeshComponent")); DisplayMeshComponent->SetupAttachment(GetMesh()); + DisplayMeshComponent->SetRelativeLocation(FVector::ZeroVector); + DisplayMeshComponent->SetRelativeRotation(FRotator::ZeroRotator); DisplayMeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); DisplayMeshComponent->SetGenerateOverlapEvents(false); } @@ -618,6 +627,12 @@ void APHYCharacterBase::ApplyCharacterSettings() MoveComponent->MaxAcceleration = Settings->DefaultMaxAcceleration; } + if (USkeletalMeshComponent* SourceMeshComponent = GetMesh()) + { + SourceMeshComponent->SetRelativeLocation(Settings->DefaultMeshRelativeLocation); + SourceMeshComponent->SetRelativeRotation(Settings->DefaultMeshRelativeRotation); + } + if (CharacterStateComponent && GetCharacterMovement() && GetCharacterMovement()->IsFalling()) { CharacterStateComponent->SetMovementState(PHYGameplayTags::State_Movement_Falling); diff --git a/Source/PHY/Public/Characters/PHYCharacterSettings.h b/Source/PHY/Public/Characters/PHYCharacterSettings.h index 2ea2077..9c75192 100644 --- a/Source/PHY/Public/Characters/PHYCharacterSettings.h +++ b/Source/PHY/Public/Characters/PHYCharacterSettings.h @@ -45,6 +45,14 @@ public: UPROPERTY(Config, EditDefaultsOnly, Category="PHY|Character") float DefaultMaxAcceleration = 2048.0f; + /** @brief 角色源 Mesh 相对 Capsule 的默认位置。 */ + UPROPERTY(Config, EditDefaultsOnly, Category="PHY|Character|Mesh") + FVector DefaultMeshRelativeLocation = FVector(0.0f, 0.0f, -90.0f); + + /** @brief 角色源 Mesh 相对 Capsule 的默认旋转。 */ + UPROPERTY(Config, EditDefaultsOnly, Category="PHY|Character|Mesh") + FRotator DefaultMeshRelativeRotation = FRotator(0.0f, -90.0f, 0.0f); + /** @brief 默认交互选项索引。 */ UPROPERTY(Config, EditDefaultsOnly, Category="PHY|Character") int32 DefaultInteractionOption = 0;