UE RPG游戏开发练手 第十八课 装备武器技能1

UE RPG游戏开发练手 第十八课 装备武器技能1

1.新建装备技能,并在角色启动数据里配置上后让它自动学习此技能。

image-20250507183901012

image-20250507183959771

image-20250507184039558

2.定义角色技能结构体

image-20250507174137918

image-20250507174334396

image-20250507174437802

HeroWeaponData.h代码

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameplayTagContainer.h"
#include "HeroWeaponData.generated.h"

class UInputMappingContext;
class UMyGameplayAbility;

USTRUCT(BlueprintType)
struct FHeroAbilitySet
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))
	FGameplayTag InputTag;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TSubclassOf<UMyGameplayAbility> AbilityToGrant;

	bool IsValid() const;
};

HeroWeaponData.cpp代码

// Fill out your copyright notice in the Description page of Project Settings.

#include "Structs/HeroWeaponData.h"
#include "MyGameplayAbility.h"
bool FHeroAbilitySet::IsValid() const
{
    return InputTag.IsValid() && AbilityToGrant;
}

3.启动数据定义一个启动自动学习的技能列表

image-20250507190325942

image-20250507190918472

DataAsset_StartUpData.h代码

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "Structs/HeroWeaponData.h"
#include "DataAsset_StartUpData.generated.h"

class UMyGameplayAbility;
class UMyAbilitySystemComponent;
/**
 * 
 */
UCLASS()
class RPGGAMETEST_API UDataAsset_StartUpData : public UDataAsset
{
	GENERATED_BODY()
public:
	// 将配置的ActivateOnGivenAbilities技能给InASCToGive组件
	virtual void GiveToAbilitySystemComponent(UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1);
protected:
	// 赋予就激活的技能列表
	UPROPERTY(EditDefaultsOnly, Category = "StartUpData")
	TArray< TSubclassOf < UMyGameplayAbility > > ActivateOnGivenAbilities;
	UPROPERTY(EditDefaultsOnly, Category = "StartUpData", meta = (TitleProperty = "InputTag"))
	TArray<FHeroAbilitySet> HeroStartUpAbilitySets;
	// 赋予一些节能给技能系统组件
	void GrantAbilities(const TArray< TSubclassOf < UMyGameplayAbility > >& InAbilitiesToGive, UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel = 1);
};

DataAsset_StartUpData.cpp代码

// Fill out your copyright notice in the Description page of Project Settings.


#include "DataAssets/DataAsset_StartUpData.h"
#include "MyAbilitySystemComponent.h"
#include "MyGameplayAbility.h"

void UDataAsset_StartUpData::GiveToAbilitySystemComponent(UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel)
{
	check(InASCToGive);

	GrantAbilities(ActivateOnGivenAbilities, InASCToGive, ApplyLevel); 

	for (const FHeroAbilitySet& AbilitySet : HeroStartUpAbilitySets)
	{
		if (!AbilitySet.IsValid()) continue;

		FGameplayAbilitySpec AbilitySpec(AbilitySet.AbilityToGrant);
		AbilitySpec.SourceObject = InASCToGive->GetAvatarActor();
		AbilitySpec.Level = ApplyLevel;
		AbilitySpec.DynamicAbilityTags.AddTag(AbilitySet.InputTag);
		InASCToGive->GiveAbility(AbilitySpec);
	}

}

void UDataAsset_StartUpData::GrantAbilities(const TArray<TSubclassOf<UMyGameplayAbility>>& InAbilitiesToGive, UMyAbilitySystemComponent* InASCToGive, int32 ApplyLevel)
{
	if (InAbilitiesToGive.IsEmpty())
	{
		return;
	}
	for (const TSubclassOf<UMyGameplayAbility>& Ability : InAbilitiesToGive)
	{
		if (!Ability) continue;

		FGameplayAbilitySpec AbilitySpec(Ability);
		AbilitySpec.SourceObject = InASCToGive->GetAvatarActor();
		AbilitySpec.Level = ApplyLevel;

		InASCToGive->GiveAbility(AbilitySpec);
	}
}

4.给角色配置上自动学习的GA_Equip技能,这样角色就自动学习上GA_Equip技能,接下来配置按键映射来激活此技能

image-20250507191112532

5.输入配置增加技能GameplayTag到InputAction的映射

image-20250507184313476

完整代码

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "GameplayTagContainer.h"
#include "DataAsset_InputConfig.generated.h"



class UInputAction;
class UInputMappingContext;

USTRUCT(BlueprintType)
struct FMyInputActionConfig
{
	GENERATED_BODY()
public:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (Categories = "InputTag"))
	FGameplayTag InputTag;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	UInputAction* InputAction;
	bool IsValid() const
	{
		return InputTag.IsValid() && InputAction;
	}
};
/**
 * 
 */
UCLASS()
class RPGGAMETEST_API UDataAsset_InputConfig : public UDataAsset
{
	GENERATED_BODY()
public:
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	UInputMappingContext* DefalutMappingContext;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InputTag"))
	TArray<FMyInputActionConfig> NativeInputActions;
	// 技能映射 GameplayTag对应InputAction
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InputTag"))
	TArray<FMyInputActionConfig> AbilityInputActions;

	UInputAction* FindNativeInputActionByTag(const FGameplayTag& InInputTag) const;
};

6.增加装备武器的GameplayTag

image-20250507184452600

完整代码 MyGameplayTags.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once
#include "NativeGameplayTags.h"

namespace MyGameplayTags {
	RPGGAMETEST_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Move);
	RPGGAMETEST_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_Look);
	RPGGAMETEST_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(InputTag_EquipAxe);
}

完整MyGameplayTags.cpp代码

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyGameplayTags.h"

namespace MyGameplayTags {
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Move, "InputTag.Move");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_Look, "InputTag.Look");
	UE_DEFINE_GAMEPLAY_TAG(InputTag_EquipAxe, "InputTag.EquipAxe");
}

7.新建装备的InputAction

image-20250507184728629

image-20250507184757413

image-20250507184840142

8.输入配置

image-20250507185002203

image-20250507185108339

image-20250507185236139

9.UMyEnhancedInputComponent组件新增绑定技能输入接口

image-20250507185500991

完整代码实现

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "EnhancedInputComponent.h"
#include "DataAssets/DataAsset_InputConfig.h"
#include "MyEnhancedInputComponent.generated.h"

/**
 * 
 */
UCLASS()
class RPGGAMETEST_API UMyEnhancedInputComponent : public UEnhancedInputComponent
{
	GENERATED_BODY()
public:
	template<class UserObject, typename CallbackFunc>
	void BindNativeInputAction(const UDataAsset_InputConfig* InInputConfig, const FGameplayTag& InInputTag, ETriggerEvent TriggerEvent, UserObject* ContextObject, CallbackFunc Func);
	template<class UserObject, typename CallbackFunc>
	void BindAbilityInputAction(const UDataAsset_InputConfig* InInputConfig, UserObject* ContextObject, CallbackFunc InputPressedFunc, CallbackFunc InputRelasedFunc);
};

template<class UserObject, typename CallbackFunc>
inline void UMyEnhancedInputComponent::BindNativeInputAction(const UDataAsset_InputConfig* InInputConfig, const FGameplayTag& InInputTag, ETriggerEvent TriggerEvent, UserObject* ContextObject, CallbackFunc Func)
{
	checkf(InInputConfig, TEXT("InInputConfig is null"));
	if (UInputAction* FoundAction = InInputConfig->FindNativeInputActionByTag(InInputTag)) {
		BindAction(FoundAction, TriggerEvent, ContextObject, Func);
	}
}

template<class UserObject, typename CallbackFunc>
inline void UMyEnhancedInputComponent::BindAbilityInputAction(const UDataAsset_InputConfig* InInputConfig, UserObject* ContextObject, CallbackFunc InputPressedFunc, CallbackFunc InputRelasedFunc)
{
	checkf(InInputConfig, TEXT("Input config data asset is null,can not proceed with binding"));

	for (const FMyInputActionConfig& AbilityInputActionConfig : InInputConfig->AbilityInputActions)
	{
		if (!AbilityInputActionConfig.IsValid()) continue;

		BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Started, ContextObject, InputPressedFunc, AbilityInputActionConfig.InputTag);
		BindAction(AbilityInputActionConfig.InputAction, ETriggerEvent::Completed, ContextObject, InputRelasedFunc, AbilityInputActionConfig.InputTag);
	}
}

10.角色类调用接口实现按键输入到技能激活的自动绑定

image-20250507185727803

image-20250507185747736

image-20250507185806715

8.技能系统组件实现技能按键按下和弹起的接口

image-20250507185842824

image-20250507185952939

9.实现GA_Equip技能添加一个测试代码

image-20250507194320507

10.运行关卡,按下1键打印Equip说明实现了按键到技能的释放功能

image-20250507194356154

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gameatp

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值