本文主要是介绍在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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!