文章目录
- UE4 使用 SlateStyle
- 前言
- 一、创建 SlateStyle 管理类
- 二、创建 SlateWidgetStyle 资源
- 1. 在代码中自定义资源内容
- 2. 在UE编辑器中修改资源样式
- 三、获取 SlateWidgetStyle 资源
- 总结
前言
在编写 Slate 时,因为没有可视化界面,我们需要 SlateBrush 才能显示一张图片。好在 Slate 提供了画刷样式集合 SlateStyle,方便我们管理和获取各种画刷、字体等资源。
在源码中检索以 Style.h 结尾的文件,可以找到一大堆内容可供参考。
一、创建 SlateStyle 管理类
我们一般会创建一个单例来持有和管理 SlateStyle,也方便我们获取 Style:
/**
* MyStyle 示例
*/
class FMyStyle
{
public:
static void Initialize();
static void Shutdown();
/** @return the singleton instance. */
static const ISlateStyle& Get( );
static FName GetStyleSetName();
private:
static TSharedRef< class FSlateStyleSet > Create();
private:
static TSharedPtr< class FSlateStyleSet > StyleInstance;
};
Initialize
和 Shutdown
方法用于注册和注销 Style,一般我们会分别在模块的 StartupModule
和 ShutdownModule
中调用它们:
void FMyStyle::Initialize()
{
if (!StyleInstance.IsValid())
{
StyleInstance = Create();
FSlateStyleRegistry::RegisterSlateStyle(*StyleInstance);
}
}
void FMyStyle::Shutdown()
{
FSlateStyleRegistry::UnRegisterSlateStyle(*StyleInstance);
ensure(StyleInstance.IsUnique());
StyleInstance.Reset();
}
Create
和Get
方法用来创建和获取我们的 Style 单例,各种画刷也在这里被创建出来。
UE 贴心的封装了 FSlateGameResources
类型,让我们能够在编辑器中更直观地修改我们的 Style,它会在创建时自动载入指定目录下的各种 Style 资源;
TSharedRef< class FSlateStyleSet > FMyStyle::Create()
{
TSharedRef< FSlateStyleSet > Style = FSlateGameResources::New(GetStyleSetName(), TEXT("/Game/Widgets"), TEXT("/Game/Widgets"));
return Style;
}
const ISlateStyle& FMyStyle::Get()
{
return *StyleInstance;
}
GetStyleSetName
方法主要是用来定义我们的 Style 集合名称,需要注意不要注册同名的 Style,会触发 check 断言。
我们通过 UE4 编辑器创建C++类的窗口中,创建 SlateWidgetStyle 类型的 C++ 类,会自动生成一个结构体和一个 WidgetStyle 类,我们只需要关注这里的结构体即可,在这个结构体中我们可以添加各种画刷内容
USTRUCT()
struct FMySlateStyle : public FSlateWidgetStyle
{
GENERATED_USTRUCT_BODY()
FMySlateStyle();
virtual ~FMySlateStyle();
// FSlateWidgetStyle
virtual void GetResources(TArray<const FSlateBrush*>& OutBrushes) const override;
static const FName TypeName;
virtual const FName GetTypeName() const override { return TypeName; };
static const FMySlateStyle& GetDefault();
// 在这个结构体中添加我们的各种画刷
UPROPERTY(EditInstanceOnly)
FSlateBrush MyBrush;
};
2. 在UE编辑器中修改资源样式
接下来打开UE编辑器,在我们指定的目录中用我们的类创建一个 SlateWidgetStyle(在 User Interface 一栏中),就能看到包含一个 MyBrush 样式的编辑界面了。
通过我们的单例类可以获取 SlateWidgetStyle 资源
// 参数是 /Game/Widgets 下的相对路径,即 /Game/Widgets/MyWidgetStyle
// 即可获得到上图中的资源
const FMySlateStyle& MyStyle = FMyStyle::Get().GetWidgetStyle<FMySlateStyle>(TEXT("MyWidgetStyle"));
// 从资源中获取我们定义的画刷即可
TSharedRef<SImage> NewImage = SNew(SImage)
.Image(&MyStyle.MyImage);
总结
通过 SlateStyle,我们就能够可视化的管理和修改 Slate 或 UWidget 中用到的各种资源了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)