Compare commits

1 Commits

Author SHA1 Message Date
PHY Dev
b0182c3d16 feat: 添加跳跃 GameplayAbility (GA)
- 创建 UPHYGA_Jump 类用于处理跳跃能力
- 在 APHYPlayerCharacter 中添加跳跃能力授予
- 支持按住跳跃和松开停止跳跃
- 集成 GAS 输入标签系统
2026-03-11 21:13:31 +08:00
4 changed files with 103 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
#include "PHYGA_Jump.h"
#include "AbilitySystemComponent.h"
#include "GameFramework/Character.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameplayTags/InputTags.h"
UPHYGA_Jump::UPHYGA_Jump()
{
// 设置能力激活类型:通过输入标签触发
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
InstancingPolicy = EGameplayAbilityInstancingPolicy::InstancedPerActor;
// 允许在移动中跳跃
AbilityTags.AddTag(FGameplayTag::RequestGameplayTag(FName("Ability.Movement.Jump")));
}
void UPHYGA_Jump::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData)
{
if (!CommitAbility(Handle, ActorInfo, ActivationInfo))
{
EndAbility(Handle, ActorInfo, ActivationInfo, true, true);
return;
}
CommitJump();
}
void UPHYGA_Jump::CommitJump()
{
ACharacter* Character = Cast<ACharacter>(GetAvatarActorFromActorInfo());
if (!Character)
{
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, true);
return;
}
Character->Jump();
}
void UPHYGA_Jump::InputReleased(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo)
{
// 当松开跳跃键时,停止跳跃(允许空中调整)
ACharacter* Character = Cast<ACharacter>(GetAvatarActorFromActorInfo());
if (Character)
{
Character->StopJumping();
}
EndAbility(Handle, ActorInfo, ActivationInfo, true, false);
}
bool UPHYGA_Jump::CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags, FGameplayTagContainer* OptionalRelevantTags) const
{
if (!Super::CanActivateAbility(Handle, ActorInfo, SourceTags, TargetTags, OptionalRelevantTags))
{
return false;
}
ACharacter* Character = Cast<ACharacter>(ActorInfo->AvatarActor);
if (!Character)
{
return false;
}
// 检查是否能够跳跃(不在空中或者角色支持多段跳)
return Character->CanJump();
}

View File

@@ -0,0 +1,25 @@
#pragma once
#include "CoreMinimal.h"
#include "AbilitySystemInterface.h"
#include "Abilities/GameplayAbility.h"
#include "PHYGA_Jump.generated.h"
UCLASS()
class PHY_API UPHYGA_Jump : public UGameplayAbility
{
GENERATED_BODY()
public:
UPHYGA_Jump();
virtual void ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) override;
virtual void InputReleased(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo) override;
protected:
virtual bool CanActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayTagContainer* SourceTags, const FGameplayTagContainer* TargetTags, FGameplayTagContainer* OptionalRelevantTags) const override;
private:
void CommitJump();
};

View File

@@ -217,6 +217,13 @@ void APHYPlayerCharacter::InitializeGAS()
ASC->SetNumericAttributeBase(UPHYAttributeSet::GetInnerPowerAttribute(), AS->GetMaxInnerPower());
}
// Grant default abilities (e.g., Jump)
if (JumpAbilityClass)
{
FGameplayAbilitySpec JumpSpec(JumpAbilityClass, 1, 0, this);
ASC->GiveAbility(JumpSpec);
}
StopRegen();
if (RegenInterval > 0.f)
{

View File

@@ -31,6 +31,10 @@ protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Class")
EPHYCharacterClass CharacterClass = EPHYCharacterClass::Warrior;
/** 跳跃能力 */
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Abilities")
TSubclassOf<UGameplayAbility> JumpAbilityClass;
/**
* 角色的相机组件
*/