Compare commits
1 Commits
main
...
feature/le
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b0182c3d16 |
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::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)
|
||||
|
||||
@@ -30,6 +30,10 @@ protected:
|
||||
/** 职业/门派/流派:决定初始四维 */
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Class")
|
||||
EPHYCharacterClass CharacterClass = EPHYCharacterClass::Warrior;
|
||||
|
||||
/** 跳跃能力 */
|
||||
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="PHY|Abilities")
|
||||
TSubclassOf<UGameplayAbility> JumpAbilityClass;
|
||||
|
||||
/**
|
||||
* 角色的相机组件
|
||||
|
||||
Reference in New Issue
Block a user