diff --git a/Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.cpp b/Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.cpp new file mode 100644 index 0000000..2aadcce --- /dev/null +++ b/Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.cpp @@ -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(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(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(ActorInfo->AvatarActor); + if (!Character) + { + return false; + } + + // 检查是否能够跳跃(不在空中或者角色支持多段跳) + return Character->CanJump(); +} diff --git a/Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.h b/Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.h new file mode 100644 index 0000000..2367a20 --- /dev/null +++ b/Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.h @@ -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(); +}; diff --git a/Source/PHY/Private/Character/PHYPlayerCharacter.cpp b/Source/PHY/Private/Character/PHYPlayerCharacter.cpp index e46b40d..413e1f2 100644 --- a/Source/PHY/Private/Character/PHYPlayerCharacter.cpp +++ b/Source/PHY/Private/Character/PHYPlayerCharacter.cpp @@ -216,6 +216,13 @@ void APHYPlayerCharacter::InitializeGAS() ASC->SetNumericAttributeBase(UPHYAttributeSet::GetHealthAttribute(), AS->GetMaxHealth()); 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) diff --git a/Source/PHY/Private/Character/PHYPlayerCharacter.h b/Source/PHY/Private/Character/PHYPlayerCharacter.h index f0b05dc..f138b84 100644 --- a/Source/PHY/Private/Character/PHYPlayerCharacter.h +++ b/Source/PHY/Private/Character/PHYPlayerCharacter.h @@ -30,6 +30,10 @@ protected: /** 职业/门派/流派:决定初始四维 */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Class") EPHYCharacterClass CharacterClass = EPHYCharacterClass::Warrior; + + /** 跳跃能力 */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Abilities") + TSubclassOf JumpAbilityClass; /** * 角色的相机组件