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

RPG14.装备武器与卸载武器

上一节课已经成功的让制作者完成了角色装备武器动画的蓝图转换。

为角色添加一个新的Ability时,

首先创建AbilityTag(包括输入标签和文本,作为能力的id)

然后创建Gameplay Ability Blueprint

创建Anim Montage,用于在赋予玩家Ability前,处理输入动作

然后赋予角色能力

接下来为角色武器设置一个Ability

1.创建两个新标签

2.打开装备的Ability,设置Ability Tags

当装备武器这个Ability进行的时候,将无法装备或者卸下其他武器

3.新建一个玩家的Gameplay Ability蓝图

然后设置Tag

4.打开卸下武器的动画序列,不启用根运动,然后创建该动画序列的蒙太奇

5.在蒙太奇内,更改默认插槽和添加动画通知

点击动画通知,设置Tag

6.打开卸下武器的GA

7。创建新的输入

打开输入的DataAccess

7.接下来对后续进行规划

作者选择在装备武器的时候,将一些能力赋予给玩家。

要完成这一步,我们需要在武器内设置一些默认的Ability和新的映射输入,这些过程是在角色装备武器时赋予的,所以这些数据应该在武器数据内完成。当玩家卸下武器的时候,同时将这些武器和输入移除。

8。打开角色的StartUpData,将结构转移至StrustType内,同时将该结构内的AbilityToGrant换成Tsubclassof<UARPGGameplayAbility>

然后进入StartUpData.cpp,删除这个函数

进入XMBStructTypes内,在WeaponData内添加新的参数

9。新建一个映射

10.打开武器蓝图

 11.打开AbilitySystemComponent,新建一个函数用于给玩家武器赋予能力

在AbilitySystemComponent.h内

//用于给武器赋予AbilitiesUFUNCTION(BlueprintCallable, Category = "XMB|Ability", meta = (AppleLevel = "1"))void GrantXMBWeaponAbilities(const TArray<FXMBAbilitySet>& InDefaultWeaponAbilities, int32 ApplyLevel, TArray<FGameplayAbilitySpecHandle>& OutGrantedAbilitySpecHandles);

在AbilitySystemComponent.cpp内

void UXMBAbilitySystemComponent::GrantXMBWeaponAbilities(const TArray<FXMBAbilitySet>& InDefaultWeaponAbilities,int32 ApplyLevel, TArray<FGameplayAbilitySpecHandle>& OutGrantedAbilitySpecHandles)
{if (InDefaultWeaponAbilities.IsEmpty()) return;for (const FXMBAbilitySet& AbilitySet : InDefaultWeaponAbilities){if (!AbilitySet.IsValid()) continue;//可以使用ASC的GiveAbility()赋予AbilityFGameplayAbilitySpec AbilitySpec(AbilitySet.AbilityToGrant);AbilitySpec.SourceObject = GetAvatarActor();AbilitySpec.Level = ApplyLevel;AbilitySpec.DynamicAbilityTags.AddTag(AbilitySet.InputTag);//要使用GiveAbility需要有一个Spec,所以先创建一个Spec//在赋予能力后,将赋予的能力存储在这个数组里OutGrantedAbilitySpecHandles.AddUnique(GiveAbility(AbilitySpec));}
}

12.打开装备武器的GA,新建一个函数用于处理装备武器时的逻辑

使用sequence节点分为三步顺序进行

①.将动画层连接起来

②.设置装备武器后的输入映射

③.通过节点"GetXMBAbilitySystemComponentfromActorInfo"访问“GrantXMBWeaponABilities",

设置赋予武器的能力

以上,实现了装备武器

13.打开玩家武器,创建新变量用于存储赋予的能力,因为是私有变量,所以还需要一个Getter和Setter

public:
UFUNCTION(BlueprintCallable)void AssignGrantedAbilitySpecHandles(const TArray<FGameplayAbilitySpecHandle>& InSpecHandles);UFUNCTION(BlueprintCallable)TArray<FGameplayAbilitySpecHandle> GetGrantedAbilitySpecHandle() const;private://用于存储赋予的能力TArray<FGameplayAbilitySpecHandle> GrantedAbilitySpecHandles;

函数实现

void AXMBWeapon::AssignGrantedAbilitySpecHandles(const TArray<FGameplayAbilitySpecHandle>& InSpecHandles)
{GrantedAbilitySpecHandles = InSpecHandles;
}TArray<FGameplayAbilitySpecHandle> AXMBWeapon::GetGrantedAbilitySpecHandle() const
{return GrantedAbilitySpecHandles;
}

14.移除玩家武器能力的函数在ASC内完成。打开ASC,创建函数用于移除已赋予的能力

//需要在蓝图内知道这个参数不是输出参数//移除武器上赋予的能力UFUNCTION(BlueprintCallable, Category = "XMB|Ability")void RemovedGrantedXMBWeaponAbilities(UPARAM(ref) TArray<FGameplayAbilitySpecHandle>& InSpecHandlesToRemove);
void UXMBAbilitySystemComponent::RemovedGrantedXMBWeaponAbilities(TArray<FGameplayAbilitySpecHandle>& InSpecHandlesToRemove)
{if (InSpecHandlesToRemove.IsEmpty()){return;}//移除生效的能力for (const FGameplayAbilitySpecHandle& SpecHandle : InSpecHandlesToRemove){if (SpecHandle.IsValid()){ClearAbility(SpecHandle);}}InSpecHandlesToRemove.Empty();
}

14.在装备武器时,需要将能力保存下来。打开装备武器的GA,存储下来

15.打开卸下武器的GA,在收到卸下武器的标签传递后,将手里的武器附着到背部的插槽

新建一个函数

在函数内分别实现取消武器接口动画层的连接,将装备武器后的默认输入更换,移除赋予武器上的能力

16

XMBStructTypes.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "GameplayTagContainer.h"
#include "XMBStructTypes.generated.h"class UARPGGameplayAbility;
class UXMBGameplayAbilityBase;
class UXMBCharacterLinkedAnimLayer;
class UInputMappingContext;//用来设置角色内Ability的结构
USTRUCT(BlueprintType)
struct FXMBAbilitySet
{GENERATED_BODY()//输入标签UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))FGameplayTag InputTag;//赋予角色的能力UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))TSubclassOf<UARPGGameplayAbility> AbilityToGrant;//检查AbilityToGrant是否有效bool IsValid() const;
};USTRUCT(BlueprintType)
struct FXMBHeroWeaponData
{GENERATED_BODY()UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)TSubclassOf<UXMBCharacterLinkedAnimLayer> WeaponAnimLayerToLink;UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)UInputMappingContext* WeaponInputMappingContext;UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InpuTTag"))TArray<FXMBAbilitySet> DefaultWeaponAbilities;
};

XMBStructTypes.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "XMBTypes/XMBStructTypes.h"
#include "AbilitySystem/Abilities/XMBGameplayAbilityBase.h"bool FXMBAbilitySet::IsValid() const
{return InputTag.IsValid() && AbilityToGrant;
}

XMBAbilitySystemComponent.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "AbilitySystemComponent.h"
#include "XMBTypes/XMBStructTypes.h"
#include "XMBAbilitySystemComponent.generated.h"/*** */
UCLASS()
class ARPG_GRIVITY_API UXMBAbilitySystemComponent : public UAbilitySystemComponent
{GENERATED_BODY()public:void OnAbilityInputPressed(const FGameplayTag& InInputTag);void OnAbilityInputReleased(const FGameplayTag& InInputTag);//用于给武器赋予AbilitiesUFUNCTION(BlueprintCallable, Category = "XMB|Ability", meta = (AppleLevel = "1"))void GrantXMBWeaponAbilities(const TArray<FXMBAbilitySet>& InDefaultWeaponAbilities, int32 ApplyLevel, TArray<FGameplayAbilitySpecHandle>& OutGrantedAbilitySpecHandles);//需要在蓝图内知道这个参数不是输出参数//移除武器上赋予的能力UFUNCTION(BlueprintCallable, Category = "XMB|Ability")void RemovedGrantedXMBWeaponAbilities(UPARAM(ref) TArray<FGameplayAbilitySpecHandle>& InSpecHandlesToRemove);
};

XMBAbilitySystemComponent.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "AbilitySystem/XMBAbilitySystemComponent.h"
#include "XMBTypes/XMBStructTypes.h"
#include "AbilitySystem/Abilities/ARPGGameplayAbility.h"void UXMBAbilitySystemComponent::OnAbilityInputPressed(const FGameplayTag& InInputTag)
{if (!InInputTag.IsValid()){return;}for (const FGameplayAbilitySpec& AbilitySpec : GetActivatableAbilities())//返回一个Ability的数组,包含所有可激活的Ability{if (!AbilitySpec.DynamicAbilityTags.HasTagExact(InInputTag)) continue;//尝试激活能力TryActivateAbility(AbilitySpec.Handle);}
}void UXMBAbilitySystemComponent::OnAbilityInputReleased(const FGameplayTag& InInputTag)
{}void UXMBAbilitySystemComponent::GrantXMBWeaponAbilities(const TArray<FXMBAbilitySet>& InDefaultWeaponAbilities,int32 ApplyLevel, TArray<FGameplayAbilitySpecHandle>& OutGrantedAbilitySpecHandles)
{if (InDefaultWeaponAbilities.IsEmpty()) return;for (const FXMBAbilitySet& AbilitySet : InDefaultWeaponAbilities){if (!AbilitySet.IsValid()) continue;//可以使用ASC的GiveAbility()赋予AbilityFGameplayAbilitySpec AbilitySpec(AbilitySet.AbilityToGrant);AbilitySpec.SourceObject = GetAvatarActor();AbilitySpec.Level = ApplyLevel;AbilitySpec.DynamicAbilityTags.AddTag(AbilitySet.InputTag);//要使用GiveAbility需要有一个Spec,所以先创建一个Spec//在赋予能力后,将赋予的能力存储在这个数组里OutGrantedAbilitySpecHandles.AddUnique(GiveAbility(AbilitySpec));}
}void UXMBAbilitySystemComponent::RemovedGrantedXMBWeaponAbilities(TArray<FGameplayAbilitySpecHandle>& InSpecHandlesToRemove)
{if (InSpecHandlesToRemove.IsEmpty()){return;}//移除生效的能力for (const FGameplayAbilitySpecHandle& SpecHandle : InSpecHandlesToRemove){if (SpecHandle.IsValid()){ClearAbility(SpecHandle);}}InSpecHandlesToRemove.Empty();
}

XMBWeapon.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameplayAbilitySpecHandle.h"
#include "Items/Weapon/WeaponBase.h"
#include "XMBTypes/XMBStructTypes.h"
#include "XMBWeapon.generated.h"/*** */
UCLASS()
class ARPG_GRIVITY_API AXMBWeapon : public AWeaponBase
{GENERATED_BODY()public:UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "WeaponData")FXMBHeroWeaponData XMBHeroWeaponData;UFUNCTION(BlueprintCallable)void AssignGrantedAbilitySpecHandles(const TArray<FGameplayAbilitySpecHandle>& InSpecHandles);UFUNCTION(BlueprintCallable)TArray<FGameplayAbilitySpecHandle> GetGrantedAbilitySpecHandle() const;private://用于存储赋予的能力TArray<FGameplayAbilitySpecHandle> GrantedAbilitySpecHandles;};

XMBWeapon.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "Items/Weapon/XMBWeapon.h"void AXMBWeapon::AssignGrantedAbilitySpecHandles(const TArray<FGameplayAbilitySpecHandle>& InSpecHandles)
{GrantedAbilitySpecHandles = InSpecHandles;
}TArray<FGameplayAbilitySpecHandle> AXMBWeapon::GetGrantedAbilitySpecHandle() const
{return GrantedAbilitySpecHandles;
}

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

相关文章:

  • 压测的服务器和用户环境的区别
  • 网站服务器出现异常的原因是什么?
  • Houdini-为人工智能训练生成合成数据
  • Vision + Robot New Style
  • 民意调查员
  • 将 AI 解答转换为 Word 文档
  • [网页五子棋][匹配模块]前后端交互接口(消息推送机制)、客户端开发(匹配页面、匹配功能)
  • Nginx的反向代理
  • 【HW系列】—Log4j2、Fastjson漏洞流量特征
  • Android 16系统源码_无障碍辅助(一)认识无障碍服务
  • 2025.05.28【Choropleth】群体进化学专用图:区域数据可视化
  • WifiEspNow库函数详解
  • 【时时三省】(C语言基础)函数的递归调用例题
  • Flask集成pyotp生成动态口令
  • DeepSeek实战:打造智能数据分析与可视化系统
  • 用 Python 实现了哪些办公自动化
  • canal高可用配置
  • Java开发之定时器学习
  • LVS -DR
  • 每日算法 -【Swift 算法】正则表达式匹配:支持 `.` 和 `*`
  • 如何设计高效的数据湖架构:存储策略、Schema 演进与数据生命周期管理
  • 基于51单片机的音乐盒汽车喇叭调音量proteus仿真
  • 基于Doc2Vec的Markdown文档分类实战:从预处理到模型评估
  • 部署swagger接口文档到云服务器
  • ZooKeeper 命令操作
  • Gin项目脚手架与标配组件
  • 网络协议DHCP
  • YOLO 系列算法的参数量
  • Java大师成长计划之第33天:应用监控与日志管理
  • 顺序表与链表专项训练:在 LeetCode 实战中深化数据结构理解