一. 创建GamePlayTag
在蓝图里创建GamePlayTag非常容易,编辑器里点。但在C++里,稍微麻烦一丢丢。
还是老规矩,看官方文档。这里建议看5.4及以上版本,有更多C++的可以更新。

个人解读,首先是你必须有这个 Gameplay模块,其次在.h 和.cpp里使用 NativegameplayTags里的宏。而且这些宏不是随便放,有的只能在CPP里 用于定义,有的只能在.h 用于声明。之前没注意,随便用,结果死活找不到定义,后来发现是放错了地方。
1.UE_DECLARE_GAMEPLAY_TAG_EXTERN 只放在头文件,EXTERN(声明)。
2.UE_DEFINE_GAMEPLAY_TAG 只放在CPP里,DEFIN (实现定义)
3.UE_DEFINE_GAMEPLAY_TAG_COMMENT 只放在CPP里,可写注释DEFIN (实现定义)
4.UE_DEFINE_GAMEPLAY_TAG_STATIC 只放在CPP里,并且只用于这个文件不需要声明。毕竟名字里面有static,本地使用
二.案例测试
共有文件用于,写.H。这里在TagType里
cpp
#include "NativeGameplayTags.h"
UE_DECLARE_GAMEPLAY_TAG_EXTERN(Movement_Mode_Working);
cpp
#include "GWXTagType.h"
UE_DEFINE_GAMEPLAY_TAG_COMMENT(Movement_Mode_Working, "Movement.Mode.Working", "Working tag");
有WorkingTag的注释

cpp
#include "TagActor.h"
UE_DEFINE_GAMEPLAY_TAG_STATIC(Movement_Mode_Fucking,"Movement.Mode.Fucking");
UE_DEFINE_GAMEPLAY_TAG_STATIC(XX_Mode_Idle, "XX.Mode.Idle");


在Container里加Tag
cpp
public:
UPROPERTY(BlueprintReadWrite,EditAnywhere,Category = "XG")
FGameplayTagContainer MyTagContainer;
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "XG")
FGameplayTagContainer MyStatusTagContainer;
};
cpp
void ATagActor::BeginPlay()
{
Super::BeginPlay();
MyTagContainer.AddTag(FGameplayTag::RequestGameplayTag(TEXT("Movement")));
MyTagContainer.AddTag(XX_Mode_Idle);
}
运行后添加成功

三. 简化C++中的标签访问
1.定义
可能会在Lua中使用到。
继承IGameplayTagAssetInterface,并重写。容器里追加上两个 现有容器。
cpp
void ATagActor::GetOwnedGameplayTags(FGameplayTagContainer& TagContainer) const
{
TagContainer.AppendTags(MyTagContainer);
TagContainer.AppendTags(MyStatusTagContainer);
}
2.其实相当于临时组建 TagContainer,追加了之前两个容器。并测试是否有一些标签。
