你的浏览器不支持canvas

让我们携手共创奇迹!

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

Date: Author: LBD

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自WindCrazy

这是一篇如何在UE的内容浏览器中添加自定义的Filter的文章

目标

在UE的内容浏览器中,可以使用Filter来过滤资源:

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

实现

//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 implementation
	virtual FLinearColor GetColor() const override;
	virtual FString GetName() const override;
	virtual FText GetDisplayName() const override;
	virtual FText GetToolTipText() const override;
	// End of FFrontendFilter implementation

	// IFilter implementation
	virtual 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 interface
	virtual 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
{
	// 注册MyFilter
	InOutFilterList.Add(MakeShareable(new FMyFilter(DefaultCategory)));
}

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

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

参考链接

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


对于本文内容有问题或建议的小伙伴,欢迎提出问题