当前位置: 首页 > news >正文

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

成功

http://www.xdnf.cn/news/364015.html

相关文章:

  • 基于CNN的猫狗图像分类系统
  • 推荐系统(二十五):基于阿里DIN(Deep Interest Network)的CTR模型实现
  • SpringCloud的作用
  • Java高频基础面试题
  • EMC|AC/DC转换器ESD静电防护
  • The 2024 ICPC Kunming Invitational Contest G. Be Positive
  • 【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)
  • 【Spring】手动创建Spring|Boot项目
  • 【Golang】gin框架动态更新路由
  • C++--NULL和nullptr的区别
  • ATH12K 驱动框架
  • ch09 题目参考思路
  • 不黑文化艺术学社首席艺术家孙溟㠭浅析“雪渔派”
  • AI赋能智能客服革新:R²AIN SUITE 如何破解医疗行业服务难题?
  • 哈希表扩容怎么处理新插入的值?Swift 是怎么做的?
  • 力扣-19.删除链表的倒数第N个结点
  • Nacos源码—Nacos配置中心实现分析
  • Mysql数据库进阶
  • LMMSE、MMSE和LS
  • vscode 配置doxygen注释和snippet
  • RT-Thread 深入系列 Part 1:RT-Thread 全景总览
  • 【赛元8523触摸按键开发调试】
  • 【vue3】vue3中封装懒加载指令
  • C++ Lambda表达式详解:匿名函数的艺术与现代编程实践
  • 数字经济时代下的消费行为变迁与经济学启示
  • 解决 Redis 缓存与数据库一致性问题的技术指南
  • 【Linux网络】Socket-TCP相关函数
  • 大模型提示词策略
  • 赋能智能交通:时空图卷积网络引领速度预测新变革
  • PostgreSQL技术大讲堂 - 第89讲:重讲数据库完全恢复