RPG11.创建玩家Ability类
本节介绍如何创建一个玩家的GameplayAbility类,玩家以后的GameplayAbility都继承于此类。
1.启动项目,创建ARPGGameplayAbility类的子类,用于给玩家以后创建GameplayAbility做基础
2.打开XMBCharacter.h,把GetCombatComponent放到public上。
class ARPG_GRIVITY_API AXMBCharacter : public ACharacterBase
{GENERATED_BODY()
public:AXMBCharacter();//获取玩家的战斗组件FORCEINLINE UXMBCombatComponent* GetXMBCombatComponent() const { return XMBCombatComponent; }};
3.在该类内创建获取角色、玩家控制器、战斗组件的函数,并且使用弱指针存储角色和控制器,减少引用和内存占用
XMBGameplayAbilityBase.h
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "AbilitySystem/Abilities/ARPGGameplayAbility.h"#include "XMBGameplayAbilityBase.generated.h"class UXMBCombatComponent;
class AXMBCharacterController;
class AXMBCharacter;
/*** */
UCLASS()
class ARPG_GRIVITY_API UXMBGameplayAbilityBase : public UARPGGameplayAbility
{GENERATED_BODY()public://获取角色UFUNCTION(BlueprintPure, Category = "XMB|Ability")AXMBCharacter* GetXMBCharacterFromActorInfo();//获取玩家控制器UFUNCTION(BlueprintPure, Category = "XMB|Ability")AXMBCharacterController* GetXMBCharacterControllerFromActorInfo();//获取玩家战斗组件UFUNCTION(BlueprintPure, Category = "XMB|Ability")UXMBCombatComponent* GetXmbCombatComponentFromActorInfo();protected:private://使用弱指针存储角色TWeakObjectPtr<AXMBCharacter> CachedXMBCharacter;//存储玩家控制器TWeakObjectPtr<AXMBCharacterController> CachedXMBController;};
XMBGameplayAbilityBase.cpp
// Fill out your copyright notice in the Description page of Project Settings.#include "AbilitySystem/Abilities/XMBGameplayAbilityBase.h"
#include "Character/XMBCharacter.h"
#include "Controllers/XMBCharacterController.h"AXMBCharacter* UXMBGameplayAbilityBase::GetXMBCharacterFromActorInfo()
{if (!CachedXMBCharacter.IsValid()){//将当前捕获到的character存储在缓存中,减少捕获次数CachedXMBCharacter = Cast<AXMBCharacter>(CurrentActorInfo->AvatarActor);}return CachedXMBCharacter.IsValid()? CachedXMBCharacter.Get() : nullptr;
}AXMBCharacterController* UXMBGameplayAbilityBase::GetXMBCharacterControllerFromActorInfo()
{if (!CachedXMBController.IsValid()){//将当前捕获到的character存储在缓存中,减少捕获次数CachedXMBController = Cast<AXMBCharacterController>(CurrentActorInfo->PlayerController);}return CachedXMBController.IsValid()? CachedXMBController.Get() : nullptr;
}UXMBCombatComponent* UXMBGameplayAbilityBase::GetXmbCombatComponentFromActorInfo()
{return GetXMBCharacterFromActorInfo()->GetXMBCombatComponent();
}
4.启动项目,进入GameplayAbility文件夹,新建XMBGameplayAbility类
5.
6.打开tags管理,添加tag(①)
GameplayTag.h
ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_EquipAxe);ARPG_GRIVITY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_UnEquipAxe);
GameplayTag.cpp
UE_DEFINE_GAMEPLAY_TAG(InputTag_EquipAxe,"InputTag.EquipAxe");UE_DEFINE_GAMEPLAY_TAG(InputTag_UnEquipAxe, "InputTag.UnEquipAxe");
7.打开输入设置DA_InputConfig(②)
在结构InputActionConfig内添加bool函数用来判断Tag和Action
//将输入标签映射到输入动作
USTRUCT(BlueprintType)
struct FXMBInputActionConfig
{GENERATED_BODY()public:UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))FGameplayTag InputTag;UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))UInputAction* InputAction = nullptr;bool IsValid() const{return InputTag.IsValid() && InputAction;}
};
在public内创建Ability的输入数组
//创建Ability的输入动作UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InputTag"))TArray<FXMBInputActionConfig> AbilityInputActions;
8.进入XMBWarriorInputComponent.h(玩家的输入组件)(③)
增加一个模板函数
//绑定输入的Abilitytemplate<class UserObject, typename CallbackFunc>void BindAbilityInputAction(const UDA_InputConfig* InInputConfig,UserObject* ContextObject, CallbackFunc InputPressedFunc, CallbackFunc InputReleasedFunc);
在模板函数内
//将输入动作绑定到回调函数,以处理Ability相关的输入
template <class UserObject, typename CallbackFunc>
inline void UXMBWarriorInputComponent::BindAbilityInputAction(const UDA_InputConfig* InInputConfig, UserObject* ContextObject,CallbackFunc InputPressedFunc, CallbackFunc InputReleasedFunc)
{checkf(InInputConfig, TEXT("Input Config data asset is null, can not proceed with binding"));for (const FXMBInputActionConfig& AbilityInputActionConfig : InInputConfig->AbilityInputActions){if (!AbilityInputActionConfig.IsValid()) continue;//若输入动作无效则跳过//绑定输入动作BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Started, ContextObject, InputPressedFunc,AbilityInputActionConfig.InputTag);BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Completed, ContextObject, InputReleasedFunc,AbilityInputActionConfig.InputTag);}
}
9.启动项目,打开GA_InputConfig,将GA_Jump复制一份,改名为GA_EquipAxe
10.打开DataAsset_XMBStartUpData.h
往里面添加数组和覆写函数
.h
#pragma once#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "Data/StartUpData/DataAsset_StartUpDataBase.h"
#include "AbilitySystem/Abilities/XMBGameplayAbilityBase.h"
#include "DataAsset_XMBStartUpData.generated.h"//用来设置角色内Ability的结构
USTRUCT(BlueprintType)
struct FXMBAbilitySet
{GENERATED_BODY()//输入标签UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))FGameplayTag InputTag;//赋予角色的能力UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))TSubclassOf<UXMBGameplayAbilityBase> AbilityToGrant;//检查AbilityToGrant是否有效bool IsValid() const;
};/*** */
UCLASS()
class ARPG_GRIVITY_API UDataAsset_XMBStartUpData : public UDataAsset_StartUpDataBase
{GENERATED_BODY()public://将数组内的能力赋予给角色的ASCvirtual void GiveToAbilitySystemComponent(UXMBAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1) override;private://UPROPERTY(EditDefaultsOnly, Category = "StartUpData", meta =(TitleProperty = "InputTag"))TArray<FXMBAbilitySet> XMBStartUpAbilitySets;};
// Fill out your copyright notice in the Description page of Project Settings.#include "Data/StartUpData/DataAsset_XMBStartUpData.h"#include "AbilitySystem/XMBAbilitySystemComponent.h"
#include "AbilitySystem/Abilities/ARPGGameplayAbility.h"bool FXMBAbilitySet::IsValid() const
{return InputTag.IsValid() && AbilityToGrant;
}//将Ability赋予给ASC
void UDataAsset_XMBStartUpData::GiveToAbilitySystemComponent(UXMBAbilitySystemComponent* InASCToGive, int32 ApplyLevel)
{Super::GiveToAbilitySystemComponent(InASCToGive, ApplyLevel);//遍历Array里的能力for (const FXMBAbilitySet& AbilitySet : XMBStartUpAbilitySets){if (!AbilitySet.IsValid()) continue;//创建GameplayAbilitySpec(FGameplayAbilitySpec AbilitySpec(AbilitySet.AbilityToGrant);//设置Spec内的属性AbilitySpec.SourceObject = InASCToGive->GetAvatarActor();AbilitySpec.Level = ApplyLevel;//添加动态标签AbilitySpec.DynamicAbilityTags.AddTag(AbilitySet.InputTag);//赋予能力InASCToGive->GiveAbility(AbilitySpec);}
}
11.启动项目,打开DA_XMBStartUpAbilities
12.启动游戏,按一下回车左边的引号键,数字小键盘按3
成功