在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

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright