搜集到的最有价值的一篇教学,按照作者的方法尝试中遇到了一些问题。【感谢这位作者!

网址:https://wiki.unrealengine.com/Slate_Style_Sets_Part_2

在此,我将详述我的制作过程。本文原创,转载请写明出处,违者必究!

首先创建 xxStyle, 我这里测试就以 Test命名。

 #pragma once
#include "SlateStyle.h" class TestStyles
{
public:
static void Initialize(); static void Shutdown(); static const class ISlateStyle& Get(); static FName GetStyleSetName(); private: static TSharedRef<class FSlateStyleSet> Create(); static TSharedPtr<class FSlateStyleSet> Instance;
};

这个类是自己创建的,没有经过 UnrealEditor 的创建向导。(当然你也可以使用向导)

 #include "Test05.h"
#include "TestStyles.h"
#include "SlateGameResources.h" TSharedPtr<FSlateStyleSet> TestStyles::Instance = nullptr; void TestStyles::Initialize()
{
if (!Instance.IsValid())
{
Instance = Create(); FSlateStyleRegistry::RegisterSlateStyle(*Instance);
}
} void TestStyles::Shutdown()
{
FSlateStyleRegistry::UnRegisterSlateStyle(*Instance);
ensure(Instance.IsUnique());
Instance.Reset();
} const class ISlateStyle& TestStyles::Get()
{
return *Instance;
} FName TestStyles::GetStyleSetName()
{
static FName StyleSetName(TEXT("TestStyles"));
return StyleSetName;
} TSharedRef<class FSlateStyleSet> TestStyles::Create()
{
return FSlateGameResources::New(TestStyles::GetStyleSetName(), "/game/ui", "/game/ui");
}

这里需要注意:FSlateGameResources 资源路径的相对位置。 /game 代替了 /context, 存放在 /context 目录下的资源,统一在地址路径中更名为 /game。

这个路径很重要!遇到错误的时候,一定要回来看看这个路径,看看能否找到 style 资源。

在这里,我没有按照网页中作者的方式创建 GameModule。(事实上我尝试了,但我失败了,暂时不想在此花费时间,所以改路。我放在了自定义的GameMode中)。

我认为只要能合理化的让 TestStyles 初始化,放哪都不是问题,(当然或许需要考虑创建的时序性,但目前我还没此顾虑)。

 AMyGameMode::AMyGameMode()
{
this->HUDClass = AMyHUD::StaticClass();
FSlateStyleRegistry::UnRegisterSlateStyle(TestStyles::GetStyleSetName());// 参考网页的作者。只为防重复注册。
TestStyles::Initialize();
}

下面这个类,是由 UnrealEditor 向导生成的,操作如下:

在 Class 目录下创建 New Class。

 #pragma once

 #include "Styling/SlateWidgetStyle.h"
#include "SlateWidgetStyleContainerBase.h" #include "GlobalTestWidgetStyle.generated.h" /**
*
*/
USTRUCT()
struct TEST05_API FGlobalTestStyle : public FSlateWidgetStyle
{
GENERATED_USTRUCT_BODY()
public: FGlobalTestStyle();
virtual ~FGlobalTestStyle(); // FSlateWidgetStyle
virtual void GetResources(TArray<const FSlateBrush*>& OutBrushes) const override;
static const FName TypeName;
virtual const FName GetTypeName() const override { return TypeName; };
static const FGlobalTestStyle& GetDefault(); UPROPERTY(EditAnywhere, Category = Appearance)
FTextBlockStyle textBlockStyle;
}; /**
*/
UCLASS(hidecategories=Object, MinimalAPI)
class UGlobalTestWidgetStyle : public USlateWidgetStyleContainerBase
{
GENERATED_BODY() public:
/** The actual data describing the widget appearance. */
UPROPERTY(Category=Appearance, EditAnywhere, meta=(ShowOnlyInnerProperties))
FGlobalTestStyle WidgetStyle; virtual const struct FSlateWidgetStyle* const GetStyle() const override
{
return static_cast< const struct FSlateWidgetStyle* >( &WidgetStyle );
}
};
 #include "Test05.h"
#include "GlobalTestWidgetStyle.h" FGlobalTestStyle::FGlobalTestStyle()
{ } FGlobalTestStyle::~FGlobalTestStyle()
{
} const FName FGlobalTestStyle::TypeName(TEXT("FGlobalTestStyle")); const FGlobalTestStyle& FGlobalTestStyle::GetDefault()
{
static FGlobalTestStyle Default;
return Default;
} void FGlobalTestStyle::GetResources(TArray<const FSlateBrush*>& OutBrushes) const
{ }

  

这里是重点, 我自己在作者的网页中没有看懂,最终咨询了同事后试验才找到正路。

在 Content 目录中创建 Style. 这个地址一定要是之前提到的 FSlateGameResources::New(  中使用的 地址,目前我用的是 /Game/ui 位置的地址,(参照上文解释)/Game/ui 的位置应该被替换成 /content/ui,如图:

在此创建:

得到一个 资源,这个名字也很重要,之后要对应上。

现在就双击修改里面的内容。

这个东西会存在,就是因为自定义的 FSlateWidgetStyle 中定义了

  UPROPERTY(EditAnywhere, Category = Appearance)

  FTextBlockStyle textBlockStyle; 

这正是它。

我修改了字体和字体大小。

到了最后一步,实例化显示了,测试代码片段如下,我写在

void AMyHUD::BeginPlay()
{
// 注意,这里的 "TestButtonStyle01" 是资源的名字
auto ss = TestStyles::Get().GetWidgetStyle<FGlobalTestStyle>("TestButtonStyle01"); textBlock = SNew(STextBlock)
.TextStyle(&ss.textBlockStyle)
.Text(FText::FromString("Hello World !")); GEngine->GameViewport->AddViewportWidgetContent(SNew(SWeakWidget).PossiblyNullContent(textBlock.ToSharedRef()));
}

所有步骤都做完了。可以显示了。效果如图:

原文中提到需要用到 Brush 的地方,以上代码不能工作,需要有其他步骤。测试成功后另写博文。


找到如何使Brush可用的方法:

void FGlobalTestStyle::GetResources(TArray<const FSlateBrush*>& OutBrushes) const
{
  OutBrushes.Add(&m_brush);  // 在这里添加需要的所有Brush,必须全部列出;
}

  

unreal 自定义 Slate Style Sets的更多相关文章

  1. [WPF]使用WindowChrome自定义Window Style

    1. 前言 做了WPF开发多年,一直未曾自己实现一个自定义Window Style,无论是<WPF编程宝典>或是各种博客都建议使用WindowStyle="None" ...

  2. [WPF自定义控件]使用WindowChrome自定义Window Style

    1. 为什么要自定义Window 对稍微有点规模的桌面软件来说自定义的Window几乎是标配了,一来设计师总是克制不住自己想想软件更个性化,为了UI的和谐修改Window也是必要的:二来多一行的空间可 ...

  3. [WPF自定义控件]?使用WindowChrome自定义Window Style

    原文:[WPF自定义控件]?使用WindowChrome自定义Window Style 1. 为什么要自定义Window 对稍微有点规模的桌面软件来说自定义的Window几乎是标配了,一来设计师总是克 ...

  4. 深入理解Android 自定义attr Style styleable以及其应用

    相信每一位从事Android开发的猿都遇到过需要自己去自定义View的需求,如果想通过xml指定一些我们自己需要的参数,就需要自己声明一个styleable,并在里面自己定义一些attr属性,这个过程 ...

  5. CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题

    项目开发过程中,发现CKEDITOR 插件的弹出框 内 如果跟据项目需要写表格(table tr td),表格的边框等属性会被 CKEDITOR的清除或覆盖,导致表格很难看. 问题关键: 插件弹出框d ...

  6. WPF 自定义Metro Style窗体

    为了使WPF程序在不同版本的操作系统上保持一致的显示效果,我们需要重写WPF控件样式.这篇博客将展示如何创建一个Metro Style的WPF窗体. 首先先看一下最终窗体的效果图, 通过截图我们可以看 ...

  7. WPF 自定义按钮 Style

    <Style TargetType="{x:Type Button}" x:Key="DefaultButton"> <Setter Prop ...

  8. android 自定义Style初探---ProgressBar

    系统自带的ProgressBar太丑了,所以我决定自定义一个Style. 原来的Style <?xml version="1.0" encoding="utf-8& ...

  9. 复习了下自定义style的使用

    一.为什么要自定义style 这是样式与控件本身脱离的一种方式.style就像html中的css,只负责自定义样式.View控件在layout中就只负责声明自己就可以了. 就像这样: 首先在style ...

随机推荐

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介绍

    RDIFramework.NET ━ .NET快速信息化系统开发框架 工作流程组件介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部 ...

  2. goim 及时消息 集成

    https://github.com/roamdy/goim-oc-sdk goim 及时消息 集成

  3. Android中ListView动态加载数据

    1. 引言: 为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的 ...

  4. 校内通知-Notifications表增加老师,家长,学生发送范围字段

    老师发送范围:TReceiveRange 家长发送范围:PReceiveRange 学生发送范围:SReceiveRange alter table Notifications add TReceiv ...

  5. Microsoft Visual Studio 2015激活密匙

    企业版:http://download.microsoft.com/download/B/8/F/B8F1470D-2396-4E7A-83F5-AC09154EB925/vs2015.ent_chs ...

  6. 【Arduino】旋转编码器的Arduino使用方法

    以前用CRT显示器的时候,调整显示器的时候用一个圆盘转动和点击的方法就可以实现选择菜单和修改设置项的值,比多个按钮的方式方便很多. 鼠标滚轮也是这种操作方法,旋转+点击,只是方向不同.最近在网上买了旋 ...

  7. asp.net5 Area的处理

    Controller加上Attribute [Area("SystemSecurity")] startup中配置 app.UseMvc(routes => { // Are ...

  8. .net之工作流工程展示及代码分享(二)工作流引擎

    在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程.流程步骤.流程实例.流程步骤实例类. 流程类: [Serializable] public class Flow { [Xml ...

  9. MySQL免安装的配置

    ①:下载并获取解压路径: ②:修改 my-default.ini: ③:管理员身份进入cmd,并cd到上面的路径(否则发生错误2,找不到文件): ④:忘记ROOT密码如何重置:

  10. [Silverlight]监听指定控件(FrameworkElement)的依赖属性(DependencyProperty)的更改

    前言 转载请注明出处:http://www.cnblogs.com/ainijiutian 最近在silverlight项目使用Telerik的控件,遇到一个问题.就是使用RadBusyIndicat ...