在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

相关文章

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Python如何将OpenCV摄像头视频流通过浏览器播放

《Python如何将OpenCV摄像头视频流通过浏览器播放》:本文主要介绍Python如何将OpenCV摄像头视频流通过浏览器播放的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完... 目录方法1:使用Flask + MJPEG流实现代码使用方法优点缺点方法2:使用WebSocket传输视

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3