前言
前文介绍了GAS与增强输入的基本使用,本文将介绍如何将输入与GA进行绑定来完成解耦和扩展。
前置准备
绑定方法
技能与输入的绑定方法,查看BindAction的函数声明,可以看到在后面有一次额外的参数包,在绑定时可以将Tag做为参数在绑定时传入:
1 | BindAction(IA, TriggerEvent, UserObject, BindFunc, Tag); |
在触发影响的IA时就可以获取到对应的Tag:
1 | void BindFunc(FGameplayTag Tag) |
在初始化时可以通过将Tag和GA进行绑定,在触发输入时通过Tag来查找对应的GA。
技能的初始化
初始化时需要将GA和Tag进行绑定,所以考虑将对应关系放入一张数据表中,在玩家进行初始化时读入这张表完成绑定。
其基本的数据结构应包含一个GA和一个TagContainer,一个技能可能会有几种触发方式,所以提供Container来存储多个Tag。
1 | USTRUCT(BlueprintType) |
同时提供基本的表结构:
1 | UCLASS() |
输入的初始化
同样使用数据表来存储输入关系,基本应该包含一个Tag和一个IA,其中Tag用于查找对应的GA。
所以输入的基本数据结构为:
1 | USTRUCT(BlueprintType) |
输入的表结构,其中提供查找方法和一个映射上下文:
1 | UCLASS() |
实现输入与GA的绑定
准备好两张表后就可以准备完成初始化与绑定了!
GA的初始化
在GameplayAbility的实例GameplayAbilitySpec中包含一个DynamicAbilityTag的TagContainer,使用其来查找对应的GA。
绑定函数:
1 | void InitializeAbility() |
输入的初始化
在绑定中,将输入分为两种,一种为GA输入;另一种为本地输入,包括玩家的基本移动等,所以在绑定时要对其进行区分,所以输入表中需要对结构进行改进,增加一个用于区分是否为技能的bool值;此外技能同样有长按与单次触发的类型,所以再增加一个bool值进行区分。
改进后的结构应为:
1 | USTRUCT(BlueprintType) |
为了确保绑定可以通用,考虑将其作为增强输入组件的模板成员函数。对于本地输入的初始化只要从输入表中拿到对应的IA完成绑定即可;对于技能输入则需要增加一个扩展参数包。
所以玩家的本地输入绑定函数应为:
1 | template<class UserClass, typename FuncType> |
绑定技能的输入为:
1 | template<class UserClass, typename Press, typename Release> |
触发IA与GA
对于玩家的本地输入,可以直接调用BindNativeAction进行绑定,有多少绑定多少,对于GA的绑定则只需要一次。
当IA触发以后则需要根据对应的Tag去寻找对应的GA,提供两个函数用来处理技能输入的按下与抬起:
在GAS中的处理
首先在ASC中提供两个函数用来处理技能输入的按下与抬起:
1 | void ProcessAbilityPressInput(FGameplayTag InputTag) |
在输入组件中的处理
随后可以在玩家的输入组件中调用这两个函数:
1 | void OnAbilityPressd(FGameplayTag InputTag) |
最终绑定
最终在增强输入中提供初始化函数SetPlayerInput:
1 | void SetPlayerInput() |
最终完成了IA与GA的绑定
管理GameplayTag
参考lyra工程使用namespace作为Tag管理,同样我们也提供一个名为GameplayTags的namespace:
1 | namespace GameplayTags |
使用ini管理资产文件
以上是直接将资产挂载在玩家身上,并不方便管理,所以可以考虑使用全局配置项来进行管理。
用UDeveloperSettings作为父类创建名为ProjectAssetSettings的子类,注意需要在uproject文件中新加一条”DeveloperSettings”的配置。
1 | UCLASS(config = Game, defaultconfig, meta = (DisplayName = "Game Asset Config")) |
总结
通过以上步骤,我们将输入与技能进行了绑定,并且通过namespace管理Tag和ini文件管理了输入与技能的资产。
- 本文作者: KongXinQing
- 本文链接: https://13114987559.github.io/2025/03/29/essay/增强输入与GAS/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!