介绍
灵感来自于Lyra的GampelayTagStack,是通过GameplayTag->Integer来追踪管理动态数值的一种机制。在GIS中,进一步扩大了这个概念,并将其称为Tag属性容器。
仅供C++用户
本文仅针对希望利用该系统开发其它游戏系统的C++用户,蓝图用户不需要阅读此文章。
Tag属性容器
GIS封装了2种方式以实现动态属性系统,分别是:
- GameplayTagIntegerContainer:包含一个GameplayTagInteger列表,每一项表示一个Tag到Int32的键值对。
- GameplayTagFloatContianer:包含一个GameplayTagFloat列表,每一项表示一个Tag到float的键值对。
它们均由FastArraySerializer实现,提供高效的网络复制,和简化的数据变化通知回调,Container中的每一项,也都标记了SaveGame,便于在单机游戏,或者服务端进行数据序列化。
使用属性容器步骤
以道具实例为例,添加Container到你的类中。
在构造函数中,将当前对象设置到容器的ContainerOwner。(如果你是使用的ActorComponent,请在InitializeComponent中设置Owner)
确保该字段正确网络同步,同步条件可以根据项目需求自定义。
确保你的Class同时实现了IGIS_GameplayTagIntegerContainerOwner和IGIS_GameplayTagFloatContainerOwner接口
然后实现接口中的OnTagFloatUpdate和OnTagIntegerUpdate,该接口允许你针对属性变化做出反应。
OnTagFloatUpdate和OnTagIntegerUpdate会在任意属性变更时调用,包括服务端和客户端。
应用案例
此特性是为了让动态属性变得更容易实现,代码是可复用的。
道具实例到了动态属性。当然,你也可以将其应用到其他系统中,而不仅仅只是库存系统。
与片段状态的区别
标签属性适合按 Gameplay Tag 保存整数或浮点数;结构化状态可通过 Fragment 的兼容状态类型及 Mixin 容器管理。需要保存或复制自定义数据时,应检查字段的 SaveGame 标记、目标对象及网络复制配置,参阅数据混入系统和保存与加载。