4.2 游戏标签 - Gameplay Tags

FGameplayTags是通过GameplayTagManager进行注册的具备一系列层级的标签名字,如Parent.Child.Grandchild...。这些标签在分类和描述一个对象的状态时格外有用。例如,如果一个角色被眩晕了,我们可以在眩晕的持续时间之内给它一个State.Debuff.StunGameplayTag

你会发现其实你是用GameplayTags替代了之前用布尔或者枚举来处理的内容,并且通过判断某个对象是否具备特定的GameplayTags来进行一些布尔逻辑运算。

当为某个对象赋予标签时,我们通常会将标签添加到对象上的ASC,这样GAS就能和他们产生相应的交互。UAbilitySystemComponent实现了接口IGameplayTagAssetInterface中的给定方法,来访问它所有拥有的GameplayTags

多个GameplayTags可以存储在一个FGameplayTagContainer里。这里通常我们更偏向于使用GameplayTagContainer而不是TArray<FGameplayTag>,因为GameplayTagContainers中有一些高效的工具。因为标签本质上就是标准的FName,如果项目设置中的Fast Replication处于激活状态的话,他们可以被高效得打包在一起到FGameplayTagContainers中,以方便网络复制的使用。Fast Replication要求服务器和客户端们有着相同的GameplayTags列表。这通常并不会有什么问题,所以你尽管激活这个选项就好了。GameplayTagContainers在遍历时也可以一返回到一个TArray<FGameplayTag>数组。

存储在FGameplayTagCountContainerGameplayTags有着一个TagMap,其内存储着相应GameplayTag的实例的数量。FGameplayTagCountContainer可能还存在某些GameplayTag,其对应的TagMapCount实际上已经是0了。当调试的时候可能就会遇到这种情况。HasTag()或者HasMatchingTag()或者相类似的函数都会去检查TagMapCount,并且在GameplayTag不存在或者相应的TagMapCount为0的情况下直接返回false。

GameplayTags必须在DefaultGameplayTags.ini中提早进行定义。虚幻编辑器在项目设置中提供了一个编辑界面来让开发者管理GameplayTags,而无需手动编辑DefaultGameplayTags.ini文件。GameplayTag的编辑器内可以进行创建、改名、查找引用以及删除操作。

GameplayTag Editor in Project Settings

查找GameplayTag的引用将会在编辑器内打开一个类似Reference Viewer的图形界面,其中展示了所有引用GameplayTag的资产。当然,不包括任何C++类。

重命名GameplayTag实际上是创建了一个重定向,与原GameplayTag有引用关系的资产可以通过这个重定向找到新的GameplayTag。我偏向于创建一个新的GameplayTag,然后手动更新所有的引用,然后删除掉旧的GameplayTag,从而避免创建一个重定向。

除了Fast ReplicationGameplayTag编辑器中有一个选项可以选择常用的网络复制的GameplayTag,从而进一步实现优化。

如果GameplayTag是由GameplayEffect添加的话,那他们就会被复制。ASC可以让你添加不会被复制并且必须手动管理的LooseGameplayTags。示例项目使用LooseGameplayTag来作为State.Dead,这样所属客户端在他们的hp降为0后就能够立即响应。重生的时候需要手动得将TagMapCount设置回0。仅在使用LooseGameplayTags时才会用到手动调整TagMapCount。我偏向于使用UAbilitySystemComponent::AddLooseGameplayTag()UAbilitySystemComponent::RemoveLooseGameplayTag() 这两个函数,而不是直接手动调整TagMapCount

在C++中去获取GameplayTag的引用:

FGameplayTag::RequestGameplayTag(FName("Your.GameplayTag.Name"))

至于高级的GameplayTag的相关操作如获取父级或者子级的GameplayTag,参考GameplayTagManager中提供的一些方法。要访问GameplayTagManager,首先要包含GameplayTagManager.h头文件,然后调用UGameplayTagManager::Get().FunctionName函数即可。实际上GameplayTagManagerGameplayTag存储为关系节点(父,子,等等),所以处理速度要快于字符串的操作和比较。

GameplayTagsGameplayTagContainers可以通过UPROPERTY中的说明符Meta = (Categories = "GameplayCue")来过滤蓝图中的标签,从而仅显示父级标签为GameplayCue的那些GameplayTags。当你知道那些仅用于GameplayCuesGameplayTag或者GameplayTagContainer变量时这样的操作就非常有用处了。

此外,还有一个单独的结构体FGameplayCueTag封装了FGameplayTag,这样也可以实现上面的那种过滤的效果。

如果你想在一个函数中过滤GameplayTag参数时,可以使用UFUNCTION中的说明符Meta = (GameplayTagFilter = "GameplayCue")。而函数中的GameplayTagContainer参数是不可以被过滤的(译者注:现在已经支持过滤的特性,但是后续翻译时仍然保留了相关描述,目的是让大家了解相关特性是如何通过元数据进行支持的)。如果你想要让你的引擎支持这个特性,参考Engine\Plugins\Editor\GameplayTagsEditor\Source\GameplayTagsEditor\Private\SGameplayTagGraphPin.cpp中的函数SGameplayTagGraphPin::ParseDefaultValueData()是怎样调用FilterString = UGameplayTagsManager::Get().GetCategoriesMetaFromField(PinStructType);并且在函数SGameplayTagGraphPin::GetListContent()中传递FilterStringSGameplayTagWidgetEngine\Plugins\Editor\GameplayTagsEditor\Source\GameplayTagsEditor\Private\SGameplayTagContainerGraphPin.cpp中的GameplayTagContainer相关函数并没有检查元字段属性并代入过滤器。

示例项目广泛使用了GameplayTags

4.2.1 响应游戏标签的变化 - Responding to Changes in Gameplay Tags

ASCGameplayTags的添加和删除提供了相应的委托。需要给定一个EGameplayTagEventType来表明事件类型,即是GameplayTags的增加亦或是删除,还是GameplayTagTagMapCount发生了变化之类的。

AbilitySystemComponent->RegisterGameplayTagEvent(FGameplayTag::RequestGameplayTag(FName("State.Debuff.Stun")), EGameplayTagEventType::NewOrRemoved).AddUObject(this, &AGDPlayerState::StunTagChanged);

回调函数中有两个参数,分别是GameplayTag和新的TagCount

virtual void StunTagChanged(const FGameplayTag CallbackTag, int32 NewCount);
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UE4中的Gameplay框架是一个强大的工具集,用于开发和实现游戏玩法和用户交互。该框架提供了许多功能和组件,以帮助游戏开发者快速构建出丰富、流畅的游戏体验。 UE4的Gameplay框架主要由以下几个方面组成: 1.输入系统:该系统可以处理各种输入设备的操作,如鼠标、键盘和游戏手柄。开发者可以轻松地设置和管理输入映射和按键绑定。此外,还提供了鼠标和手柄的即时响应和移动方向控制功能,使玩家能够自由操作游戏中的角色。 2.角色控制器:角色控制器是游戏玩家在游戏中扮演的角色,他们的控制是通过输入系统和蓝图来实现的。游戏玩家可以移动角色、执行动作、攻击敌人等。角色还可以通过动画系统实现自然的运动和交互。 3.人工智能:UE4的Gameplay框架提供了内置的人工智能系统,可以对NPC和敌人进行编程控制。开发者可以设置敌人的行为模式、路径寻找和攻击策略,让游戏中的敌人具有更真实和智能的表现。 4.物理模拟:UE4的Gameplay框架使用了物理引擎来实现真实的物理模拟效果,比如碰撞、重力和刚体运动等。这使开发者能够创建更真实和具有交互性的游戏世界,使玩家可以与环境进行互动。 总之,UE4的Gameplay框架提供了强大而灵活的工具,帮助开发者轻松地构建出丰富多样的游戏玩法和用户交互。无论是开发动作冒险游戏、射击游戏还是角色扮演游戏,该框架都能满足开发者的需求,并带来令人惊叹的游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值