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;
}