在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

相关文章

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla