feat: 添加跳跃 GameplayAbility (GA)
- 创建 UPHYGA_Jump 类用于处理跳跃能力 - 在 APHYPlayerCharacter 中添加跳跃能力授予 - 支持按住跳跃和松开停止跳跃 - 集成 GAS 输入标签系统
This commit is contained in:
67
Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.cpp
Normal file
67
Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.cpp
Normal 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();
|
||||||
|
}
|
||||||
25
Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.h
Normal file
25
Source/PHY/Private/AbilitySystem/Abilities/PHYGA_Jump.h
Normal 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();
|
||||||
|
};
|
||||||
@@ -216,6 +216,13 @@ void APHYPlayerCharacter::InitializeGAS()
|
|||||||
ASC->SetNumericAttributeBase(UPHYAttributeSet::GetHealthAttribute(), AS->GetMaxHealth());
|
ASC->SetNumericAttributeBase(UPHYAttributeSet::GetHealthAttribute(), AS->GetMaxHealth());
|
||||||
ASC->SetNumericAttributeBase(UPHYAttributeSet::GetInnerPowerAttribute(), AS->GetMaxInnerPower());
|
ASC->SetNumericAttributeBase(UPHYAttributeSet::GetInnerPowerAttribute(), AS->GetMaxInnerPower());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Grant default abilities (e.g., Jump)
|
||||||
|
if (JumpAbilityClass)
|
||||||
|
{
|
||||||
|
FGameplayAbilitySpec JumpSpec(JumpAbilityClass, 1, 0, this);
|
||||||
|
ASC->GiveAbility(JumpSpec);
|
||||||
|
}
|
||||||
|
|
||||||
StopRegen();
|
StopRegen();
|
||||||
if (RegenInterval > 0.f)
|
if (RegenInterval > 0.f)
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ protected:
|
|||||||
/** 职业/门派/流派:决定初始四维 */
|
/** 职业/门派/流派:决定初始四维 */
|
||||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Class")
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Class")
|
||||||
EPHYCharacterClass CharacterClass = EPHYCharacterClass::Warrior;
|
EPHYCharacterClass CharacterClass = EPHYCharacterClass::Warrior;
|
||||||
|
|
||||||
|
/** 跳跃能力 */
|
||||||
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Abilities")
|
||||||
|
TSubclassOf<UGameplayAbility> JumpAbilityClass;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色的相机组件
|
* 角色的相机组件
|
||||||
|
|||||||
Reference in New Issue
Block a user