在UE的内容浏览器中添加自定义的Filter

2024-09-06 23:08

本文主要是介绍在UE的内容浏览器中添加自定义的Filter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标需求

在UE的内容浏览器中,可以使用Filter来过滤资源:
在这里插入图片描述
目标需求是在这之中添加一个自定义的Filter

其代码上是非常简单的,在本文末尾。
然而我觉得找到方法的过程也是挺有意思的,因此我也记录了下来。

探索过程

1. 在哪定义?

首先,我猜测Other Filters下的各个项目,也都是通过代码添加的。因此,我调了其中一项,比如Show Redirectors,然后对代码进行搜索,希望能看到添加它的位置。而搜索的路径,我选择了\Engine\Source\Editor\,因为我想它是属于编辑器的部分。(如果有更深入的猜测,也可以以更精确的路径来搜索以加快搜索速度)
在这里插入图片描述
幸运的是,确实在\Engine\Source\Editor\ContentBrowser\Private\FrontendFilters.h中搜索到了:
在这里插入图片描述
经观察,Other Filters下的很多项都能在这里找到:
在这里插入图片描述

2. 在哪添加?

接下来的问题是,它们是如何被添加的呢?
接下来同样采取字符串搜索的方式,只不过这次因为知道了精确的类名,比如FFrontendFilter_ShowRedirectors,所以更有自信能搜到些什么。

不出所料,在\Engine\Source\Editor\ContentBrowser\Private\SFilterList.cpp中找到了添加他们的代码:
在这里插入图片描述

3. 可以在引擎代码之外添加吗?

上面的代码都是在引擎中。最好能有在引擎代码之外,比如插件中添加,那么可以吗?

观察代码发现,一个Filter是通过AllFrontendFilters函数添加的,而调用AllFrontendFilters的地方不止是对内建的filter使用。比如在后面的位置,可以看到它遍历了UContentBrowserFrontEndFilterExtension对象并依据它来添加,注释还标注了 Add any global user-defined frontend filters

在这里插入图片描述
看来,在引擎代码之外添加Filter一定是可行的,方法就是通过UContentBrowserFrontEndFilterExtension

// Override this class in order to make an additional front-end filter available in the Content Browser
UCLASS(Abstract)
class CONTENTBROWSER_API UContentBrowserFrontEndFilterExtension : public UObject
{GENERATED_BODY()public:// Override this method to add new frontend filtersvirtual void AddFrontEndFilterExtensions(TSharedPtr<class FFrontendFilterCategory> DefaultCategory, TArray< TSharedRef<class FFrontendFilter> >& InOutFilterList) const { }
};

4*. 那么,有没有范例代码呢?

虽然已经知道了方法,但是自己继续摸索具体的代码怎么写还是相对低效的,如果能搜索到范例代码就更好了(๑ `▽´๑)

幸运的是,以UContentBrowserFrontEndFilterExtension为关键字,确实搜索到了:
在这里插入图片描述
链接:https://www.cc2.co.jp/blog/?p=16120

代码

搜索到的范例代码注释是日文的,我换成了中文。
而且在上传网页时一些模板符号<>被当做了节点的符号,导致代码有缺失内容,需要补全。
另外,我也让Filter判断的逻辑做了简化。

调整以后,代码如下:


MyFilter.h

#pragma once#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "FrontendFilterBase.h"// 自定义Filter
class FMyFilter : public FFrontendFilter
{
public:FMyFilter(TSharedPtr<FFrontendFilterCategory> InCategory): FFrontendFilter(InCategory){}// FFrontendFilter implementationvirtual FLinearColor GetColor() const override;virtual FString GetName() const override;virtual FText GetDisplayName() const override;virtual FText GetToolTipText() const override;// End of FFrontendFilter implementation// IFilter implementationvirtual bool PassesFilter(FAssetFilterType InItem) const override;// End of IFilter implementation
};

MyFilter.cpp

#include "MyFilter.h"#define LOCTEXT_NAMESPACE "MyFilter"// 颜色
FLinearColor FMyFilter::GetColor() const
{return FLinearColor::Yellow;
}// 引擎内部的标识名称,不可重复
FString FMyFilter::GetName() const
{return TEXT("MyFilter");
}// 显示名
FText FMyFilter::GetDisplayName() const
{return LOCTEXT("MyFilterDisplay", "MyFilter");
}// 鼠标指针移到Filter列表上时显示的提示
FText FMyFilter::GetToolTipText() const
{return LOCTEXT("MyDisplayTooltip", "This is my Filter");
}// Filter的主要逻辑
// 内容浏览器中显示的文件夹下的每个文件都经过这个判断。
bool FMyFilter::PassesFilter(FAssetFilterType InItem) const
{//当前逻辑:过滤掉开头为“temp”的资源return !InItem.AssetName.ToString().StartsWith("temp");
}#undef LOCTEXT_NAMESPACE

MyFilterExtention.h

#pragma once#include "CoreMinimal.h"
#include "UObject/ObjectMacros.h"
#include "ContentBrowserFrontEndFilterExtension.h"#include "MyFilterExtention.generated.h"UCLASS()
class UMyFilterExtention : public UContentBrowserFrontEndFilterExtension
{
public:GENERATED_BODY()// UContentBrowserFrontEndFilterExtension interfacevirtual void AddFrontEndFilterExtensions(TSharedPtr<class FFrontendFilterCategory> DefaultCategory, TArray< TSharedRef<class FFrontendFilter> >& InOutFilterList) const override;// End of UContentBrowserFrontEndFilterExtension interface
};

MyFilterExtention.cpp

#include "MyFilterExtention.h"
#include "MyFilter.h"void UMyFilterExtention::AddFrontEndFilterExtensions(TSharedPtr<class FFrontendFilterCategory> DefaultCategory, TArray< TSharedRef<class FFrontendFilter> >& InOutFilterList) const
{// 注册MyFilterInOutFilterList.Add(MakeShareable(new FMyFilter(DefaultCategory)));
}

另外要注意,要在这个模块的.Build.cs中添加对“ContentBrowser”模块的依赖:
在这里插入图片描述


主要关注的就是FMyFilter::PassesFilter函数,因为过滤的逻辑在此指定。
比如我这里就是过滤掉开头为“temp”的资源:

return !InItem.AssetName.ToString().StartsWith("temp");

效果:
在这里插入图片描述

这篇关于在UE的内容浏览器中添加自定义的Filter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143379

相关文章

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

springboot filter实现请求响应全链路拦截

《springbootfilter实现请求响应全链路拦截》这篇文章主要为大家详细介绍了SpringBoot如何结合Filter同时拦截请求和响应,从而实现​​日志采集自动化,感兴趣的小伙伴可以跟随小... 目录一、为什么你需要这个过滤器?​​​二、核心实现:一个Filter搞定双向数据流​​​​三、完整代码

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.