【UE源码向】GameplayTag ToolTip 增加 DevComment

GamepayTag 的 ToolTip 增加 DevComment

  • 我想绝大部分的 UE 项目都会大量使用到 GameplayTag 的功能,主要是用来做一些功能分类、状态标记和资产引用。
  • 问题:在引擎的早期版本中(< 5.6),GameplayTag 的鼠标悬浮提示只会显示 GameplayTag 的名字,而不会显示其对应的开发者功能描述(即创建Tag时手动填入的功能说明)。
  • 我自己早前支持了这个符合直觉的显示,最近发现新版引擎官方的代码也合入了某个开发者的修改,代码很类似,如果有项目是低版本引擎,不妨也合入或者直接改代码支持一下,还是挺好用的。

直接上手

这里就不放我的修改了,和UE官方的类似,我们直接看代码
官方 GitHub PR 修改

  • 新增获取 TagNode DevComment 的接口
    // 在 GameplayTagsManager.h 中的 FGameplayTagNode 结构体中新增接口,下面会调用到
    #if WITH_EDITORONLY_DATA
        /** Returns the Comment for this tag */
        FString GetDevComment() const { return DevComment; }
    #endif
    
  • 先支持单个 FGameplayTag 的 DevComment 显示
    // 在 SGameplayTagCombo.cpp 中修改 SGameplayTagCombo::GetToolTipText(),主要是后半部分,将 TagName 和 DevComment 拼起来显示
    FText SGameplayTagCombo::GetToolTipText() const
    {
        FGameplayTag TagToDisplay;
        if (PropertyHandle.IsValid())
        {
            return TagsFromProperty.IsEmpty() ? FText::GetEmpty() : FText::FromName(TagsFromProperty[0].GetTagName());
            TagToDisplay = (TagsFromProperty.Num() > 0) ? TagsFromProperty[0] : FGameplayTag();
        }
        else
        {
            TagToDisplay = TagAttribute.Get();
        }
    
        TSharedPtr<FGameplayTagNode> TagNode = UGameplayTagsManager::Get().FindTagNode(TagToDisplay);
        if (TagNode.IsValid() && !TagNode->GetDevComment().IsEmpty())
        {
            // 这里加了两个换行符,一个换行更好看些
            return FText::FromString(FString::Printf(TEXT("%s\n\n%s"), *TagToDisplay.ToString(), *TagNode->GetDevComment()));
        }
        else
        {
            return FText::FromName(TagToDisplay.GetTagName());
        }
        return FText::FromName(TagAttribute.Get().GetTagName());
    }
    
  • 再支持 GameplayTagContainer 的 DevComment 显示
    // 1. 在 SGameplayTagContainerCombo.h 中SGameplayTagContainerCombo 类中 新增函数用于获取某个 Tag 的 ToolTip
    FText GetTagToolTipText(const FGameplayTag TagToDisplay) const;
    
    // 2. 在 SGameplayTagContainerCombo.cpp 中SGameplayTagContainerCombo类中实现
    FText SGameplayTagContainerCombo::GetTagToolTipText(const FGameplayTag TagToDisplay) const
    {
        TSharedPtr<FGameplayTagNode> TagNode = UGameplayTagsManager::Get().FindTagNode(TagToDisplay);
    
        if (TagNode.IsValid() && !TagNode->GetDevComment().IsEmpty())
        {
            // 同样这里的两个换行有点多余,一个即可
            return FText::FromString(FString::Printf(TEXT("%s\n\n%s"), *TagToDisplay.ToString(), *TagNode->GetDevComment()));
        }
        else
        {
            return FText::FromName(TagToDisplay.GetTagName());
        }
    }
    
    // 3. 把ToolTip的获取回调函数用上,在 SGameplayTagContainerCombo::MakeTagListViewRow 函数里将 ToolTipText 的回调绑定为2中新增的函数
    .ToolTipText(this, &SGameplayTagContainerCombo::GetTagToolTipText, Item->Tag)
    

效果

img

posted @ 2025-11-16 18:41  yocichen  阅读(10)  评论(0)    收藏  举报