Slate用户界面架构

On this page:
  • 概述
  • 声明式语法
  • 构成
  • 风格
  • 输入
  • 输出
  • 布局图元
  • 用户驱动的布局
  • 开发者工具
  • 引擎访问

概述

Slate 是一种完全自定义的、平台无关的用户界面架构,其设计目的是使得构建工具及应用程序(比如虚幻编辑器)的用户界面或者游戏中的用户界面变得更加有趣、高效。它结合了一种可以轻松设计、布局及风格化组件的声明式语法,使得可以轻松地创建用户界面并进行迭代开发。

Slate用户界面解决方案使得为工具及应用程序创建图形用户界面变得非常简单,并且可以快速地在界面上进行迭代开发。

声明式语法

Slate的 声明式语法 使得程序员可以直接构建用户界面,而不需要添加中间层来进行处理。提供了一套完整的宏来简化声明及创建新控件的过程。

SLATE_BEGIN_ARGS( SSubMenuButton ): _ShouldAppearHovered( false ){}/** The label to display on the button */SLATE_ATTRIBUTE( FString, Label )/** Called when the button is clicked */SLATE_EVENT( FOnClicked, OnClicked )/** Content to put in the button */SLATE_NAMED_SLOT( FArguments, FSimpleSlot, Content )/** Whether or not the button should appear in the hovered state */SLATE_ATTRIBUTE( bool, ShouldAppearHovered )
SLATE_END_ARGS()

构成

Slate的构成架构使得可以轻松地快速排列用户界面元素来进行原型设计和迭代开发。

这里是一个正在构建的用户界面的片段:

// Add a new section for static meshes
ContextualEditingWidget->AddSlot()
.Padding( 2.0f )
[SNew( SDetailSection ).SectionName("StaticMeshSection").SectionTitle( LOCTEXT("StaticMeshSection", "Static Mesh").ToString() ).Content()[SNew( SVerticalBox )+ SVerticalBox::Slot().Padding( 3.0f, 1.0f )[SNew( SHorizontalBox )+ SHorizontalBox::Slot().Padding( 2.0f )[SNew( SComboButton ).ButtonContent()[SNew( STextBlock ).Text( LOCTEXT("BlockingVolumeMenu", "Create Blocking Volume") ) .Font( FontInfo )].MenuContent()[BlockingVolumeBuilder.MakeWidget()]]]]
];

上面的语法创建了以下用户界面元素:

风格

您可以创建风格,并将其应用到一个控件的各个部分上。这使得在用户界面上迭代处理组件的外观、共享及重用风格变得更加容易。

// Tool bar
{Set( "ToolBar.Background", FSlateBoxBrush( TEXT("Common/GroupBorder"), FMargin(4.0f/16.0f) ) );Set( "ToolBarButton.Normal", FSlateNoResource() );      // Note: Intentionally transparent backgroundSet( "ToolBarButton.Pressed", FSlateBoxBrush( TEXT("Old/MenuItemButton_Pressed"), 4.0f/32.0f ) );Set( "ToolBarButton.Hovered", FSlateBoxBrush( TEXT("Old/MenuItemButton_Hovered"), 4.0f/32.0f ) );// Tool bar buttons are sometimes toggle buttons, so they need styles for "checked" stateSet( "ToolBarButton.Checked", FSlateBoxBrush( TEXT("Old/MenuItemButton_Pressed"),  4.0f/32.0f, FLinearColor( 0.3f, 0.3f, 0.3f ) ) );Set( "ToolBarButton.Checked_Hovered", FSlateBoxBrush( TEXT("Old/MenuItemButton_Hovered"),  4.0f/32.0f ) );Set( "ToolBarButton.Checked_Pressed", FSlateBoxBrush( TEXT("Old/MenuItemButton_Pressed"),  4.0f/32.0f, FLinearColor( 0.5f, 0.5f, 0.5f ) ) );// Tool bar button label fontSet( "ToolBarButton.LabelFont", FSlateFontInfo( TEXT("Roboto-Regular"), 8 ) );
}

构建界面时使用的风格:

SNew( SBorder )
.BorderImage( FEditorStyle::GetBrush( "ToolBar.Background" ) )
.Content()
[SNew(SHorizontalBox)// Compile button (faked to look like a multibox button)+SHorizontalBox::Slot()[SNew(SButton).Style(TEXT("ToolBarButton")).OnClicked( InKismet2.ToSharedRef(), &FKismet::Compile_OnClicked ).IsEnabled( InKismet2.ToSharedRef(), &FKismet::InEditingMode ).Content()[SNew(SVerticalBox)+SVerticalBox::Slot().Padding( 1.0f ).HAlign(HAlign_Center)[SNew(SImage).Image(this, &SBlueprintEditorToolbar::GetStatusImage).ToolTipText(this, &SBlueprintEditorToolbar::GetStatusTooltip)]+SVerticalBox::Slot().Padding( 1.0f ).HAlign(HAlign_Center)[SNew(STextBlock).Text(LOCTEXT("CompileButton", "Compile")).Font( FEditorStyle::GetFontStyle( FName( "ToolBarButton.LabelFont" ) ) ).ToolTipText(LOCTEXT("CompileButton_Tooltip", "Recompile the blueprint"))]]]
]

输入

Slate支持接收鼠标和键盘输入。它提供了一个灵活的按键绑定系统,使得它可以将任何按键组合绑定到任何命令上;且提供了动态修改这些按键绑定的功能。

输出

Slate应用目标平台无关的渲染图元,使得它可以在任何平台上运行。它目前针对的平台是 Unreal Engine 4 RHI,所以它可以在任何虚幻引擎4运行的平台上运行。

布局图元

布局图元使得它可以轻松地创建静态及动态布局。

FString DefaultLayout =TEXT( " {" )TEXT( "     \"type\": \"tabstack\"," )TEXT( "     \"sizecoeff\": 1," )TEXT( "     \"children\":" )TEXT( "     [" )TEXT( "         {" )TEXT( "             \"type\": \"tab\"," )TEXT( "             \"content\": \"Widget Inspector Tab\"" )TEXT( "         }," )TEXT( "         {" )TEXT( "             \"type\": \"tab\"," )TEXT( "             \"content\": \"Plugin Manager Tab\"" )TEXT( "         }," )TEXT( "         {" )TEXT( "             \"type\": \"tab\"," )TEXT( "             \"content\": \"Debug Tools\"" )TEXT( "         }" )TEXT( "     ]" )TEXT( " }" );

上面的布局创建了以下用户界面:

用户驱动的布局

Slate的 停靠布局 功能将布局设置的权利交到了用户的手中,允许用户重新排列选卡面板并停靠到任何可能的布局中。自定义用户工作环境的功能,使得用户可以按他们喜欢的方式来应用工具。

浮动的选卡

拖拽选卡到停靠目标

停靠后的选卡

开发者工具

Slate Widget Inspector(Slate控件检查器) 提供了调试及分析用户界面和相关代码的方法。这可以辅助跟踪缺陷和不需要的行为,并且可以分析及优化您的用户界面。

引擎访问

Slate用户界面系统为程序员提供了到引擎和编辑器的直接访问权;使得它可以更轻松地实现新功能和工具来适应任何开发团队的工作流程及任何项目的需求。

Slate用户界面架构

On this page:
  • 概述
  • 声明式语法
  • 构成
  • 风格
  • 输入
  • 输出
  • 布局图元
  • 用户驱动的布局
  • 开发者工具
  • 引擎访问

概述

Slate 是一种完全自定义的、平台无关的用户界面架构,其设计目的是使得构建工具及应用程序(比如虚幻编辑器)的用户界面或者游戏中的用户界面变得更加有趣、高效。它结合了一种可以轻松设计、布局及风格化组件的声明式语法,使得可以轻松地创建用户界面并进行迭代开发。

Slate用户界面解决方案使得为工具及应用程序创建图形用户界面变得非常简单,并且可以快速地在界面上进行迭代开发。

声明式语法

Slate的 声明式语法 使得程序员可以直接构建用户界面,而不需要添加中间层来进行处理。提供了一套完整的宏来简化声明及创建新控件的过程。

SLATE_BEGIN_ARGS( SSubMenuButton ): _ShouldAppearHovered( false ){}/** The label to display on the button */SLATE_ATTRIBUTE( FString, Label )/** Called when the button is clicked */SLATE_EVENT( FOnClicked, OnClicked )/** Content to put in the button */SLATE_NAMED_SLOT( FArguments, FSimpleSlot, Content )/** Whether or not the button should appear in the hovered state */SLATE_ATTRIBUTE( bool, ShouldAppearHovered )
SLATE_END_ARGS()

构成

Slate的构成架构使得可以轻松地快速排列用户界面元素来进行原型设计和迭代开发。

这里是一个正在构建的用户界面的片段:

// Add a new section for static meshes
ContextualEditingWidget->AddSlot()
.Padding( 2.0f )
[SNew( SDetailSection ).SectionName("StaticMeshSection").SectionTitle( LOCTEXT("StaticMeshSection", "Static Mesh").ToString() ).Content()[SNew( SVerticalBox )+ SVerticalBox::Slot().Padding( 3.0f, 1.0f )[SNew( SHorizontalBox )+ SHorizontalBox::Slot().Padding( 2.0f )[SNew( SComboButton ).ButtonContent()[SNew( STextBlock ).Text( LOCTEXT("BlockingVolumeMenu", "Create Blocking Volume") ) .Font( FontInfo )].MenuContent()[BlockingVolumeBuilder.MakeWidget()]]]]
];

上面的语法创建了以下用户界面元素:

风格

您可以创建风格,并将其应用到一个控件的各个部分上。这使得在用户界面上迭代处理组件的外观、共享及重用风格变得更加容易。

// Tool bar
{Set( "ToolBar.Background", FSlateBoxBrush( TEXT("Common/GroupBorder"), FMargin(4.0f/16.0f) ) );Set( "ToolBarButton.Normal", FSlateNoResource() );      // Note: Intentionally transparent backgroundSet( "ToolBarButton.Pressed", FSlateBoxBrush( TEXT("Old/MenuItemButton_Pressed"), 4.0f/32.0f ) );Set( "ToolBarButton.Hovered", FSlateBoxBrush( TEXT("Old/MenuItemButton_Hovered"), 4.0f/32.0f ) );// Tool bar buttons are sometimes toggle buttons, so they need styles for "checked" stateSet( "ToolBarButton.Checked", FSlateBoxBrush( TEXT("Old/MenuItemButton_Pressed"),  4.0f/32.0f, FLinearColor( 0.3f, 0.3f, 0.3f ) ) );Set( "ToolBarButton.Checked_Hovered", FSlateBoxBrush( TEXT("Old/MenuItemButton_Hovered"),  4.0f/32.0f ) );Set( "ToolBarButton.Checked_Pressed", FSlateBoxBrush( TEXT("Old/MenuItemButton_Pressed"),  4.0f/32.0f, FLinearColor( 0.5f, 0.5f, 0.5f ) ) );// Tool bar button label fontSet( "ToolBarButton.LabelFont", FSlateFontInfo( TEXT("Roboto-Regular"), 8 ) );
}

构建界面时使用的风格:

SNew( SBorder )
.BorderImage( FEditorStyle::GetBrush( "ToolBar.Background" ) )
.Content()
[SNew(SHorizontalBox)// Compile button (faked to look like a multibox button)+SHorizontalBox::Slot()[SNew(SButton).Style(TEXT("ToolBarButton")).OnClicked( InKismet2.ToSharedRef(), &FKismet::Compile_OnClicked ).IsEnabled( InKismet2.ToSharedRef(), &FKismet::InEditingMode ).Content()[SNew(SVerticalBox)+SVerticalBox::Slot().Padding( 1.0f ).HAlign(HAlign_Center)[SNew(SImage).Image(this, &SBlueprintEditorToolbar::GetStatusImage).ToolTipText(this, &SBlueprintEditorToolbar::GetStatusTooltip)]+SVerticalBox::Slot().Padding( 1.0f ).HAlign(HAlign_Center)[SNew(STextBlock).Text(LOCTEXT("CompileButton", "Compile")).Font( FEditorStyle::GetFontStyle( FName( "ToolBarButton.LabelFont" ) ) ).ToolTipText(LOCTEXT("CompileButton_Tooltip", "Recompile the blueprint"))]]]
]

输入

Slate支持接收鼠标和键盘输入。它提供了一个灵活的按键绑定系统,使得它可以将任何按键组合绑定到任何命令上;且提供了动态修改这些按键绑定的功能。

输出

Slate应用目标平台无关的渲染图元,使得它可以在任何平台上运行。它目前针对的平台是 Unreal Engine 4 RHI,所以它可以在任何虚幻引擎4运行的平台上运行。

布局图元

布局图元使得它可以轻松地创建静态及动态布局。

FString DefaultLayout =TEXT( " {" )TEXT( "     \"type\": \"tabstack\"," )TEXT( "     \"sizecoeff\": 1," )TEXT( "     \"children\":" )TEXT( "     [" )TEXT( "         {" )TEXT( "             \"type\": \"tab\"," )TEXT( "             \"content\": \"Widget Inspector Tab\"" )TEXT( "         }," )TEXT( "         {" )TEXT( "             \"type\": \"tab\"," )TEXT( "             \"content\": \"Plugin Manager Tab\"" )TEXT( "         }," )TEXT( "         {" )TEXT( "             \"type\": \"tab\"," )TEXT( "             \"content\": \"Debug Tools\"" )TEXT( "         }" )TEXT( "     ]" )TEXT( " }" );

上面的布局创建了以下用户界面:

用户驱动的布局

Slate的 停靠布局 功能将布局设置的权利交到了用户的手中,允许用户重新排列选卡面板并停靠到任何可能的布局中。自定义用户工作环境的功能,使得用户可以按他们喜欢的方式来应用工具。

浮动的选卡

拖拽选卡到停靠目标

停靠后的选卡

开发者工具

Slate Widget Inspector(Slate控件检查器) 提供了调试及分析用户界面和相关代码的方法。这可以辅助跟踪缺陷和不需要的行为,并且可以分析及优化您的用户界面。

引擎访问

Slate用户界面系统为程序员提供了到引擎和编辑器的直接访问权;使得它可以更轻松地实现新功能和工具来适应任何开发团队的工作流程及任何项目的需求。

UE4 Slate概述相关推荐

  1. UE4 Slate四 SlateUI如何做动画

    原创文章,转载请注明出处. 点击观看上一篇<UE4 Slate三 SlateUI代码讲解> 点击观看下一篇<UE4 Slate五 SlateUI如何自定义样式(Custom Styl ...

  2. UE4 Slate九 控件反射器Widget Reflector介绍

    原创文章,转载请注明出处. 点击观看上一篇<UE4 Slate八 SlateUI使用总结> 点击观看下一篇<UE4 Slate十 SlateViewer介绍> 虚幻引擎 Sla ...

  3. UE4 Slate独立引用程序(摘抄大象无形)

    UE4 Slate独立引用程序(摘抄大象无形) 简介 如何开始 BlankProgram 走的更远 预先准备 增加模块引用 添加头文件应用 修改Main函数为WinMain 添加LOCTEXT_NAM ...

  4. UE4 Slate UI

    UE4 Slate UI 使用<UE4 Slate创建独立窗口APP>的Demo学习使用简单的UE4 Slate UI 布局的使用 SOverlay:重叠布局,在z方向上布局控件. SHo ...

  5. UE4 Slate Architecture

    Slate Architecture Unreal Engine 4.9 Slate用户界面架构 On this page: How to Read This Page Motivation Core ...

  6. UE4 Hello Slate

    2015年8月30日0 文章目录 [隐藏] 1 准备工作 2 SlateWidget 3 HUD 4 最终结果 UE4中通常的游戏内逻辑使用UMG就可以了,当需要一些独特的功能时就会需要用到Slate ...

  7. 虚幻引擎编辑器开发基础(一)

    虚幻引擎编辑器开发基础(一) 文章目录 虚幻引擎编辑器开发基础(一) 一.前言 二.插件与模块 2.1 插件(Plguin) 2.1.1 插件的作用 2.1.2 插件的类型 2.1.3 插件结构 2. ...

  8. 虚幻4皮肤材质_虚幻周报20200721 | CJ就要开始啦~

    官方知乎号:虚幻引擎 搜集日期:20200713-20200719 整理编辑: 大钊,小辉辉,马古斯,小帅帅 声明:文档搜集来自网上,难免遗漏,请联系我们投稿和添加关注.该文档版权归整理编辑者共同所有 ...

  9. ue4 改变枢轴位置_UE4渲染模块概述(四)---反射

    在前一文中介绍了像素着色器与material,大概知道了UE4材质的生产管线: Jerry:UE4渲染模块概述(三)---Pixel Shader & Material Rendering​z ...

最新文章

  1. Android中设置EditText默认无焦点
  2. 北京内推 | ​百度自然语言处理部内容理解方向招收NLP算法实习生
  3. OpenCASCADE:OCCT应用框架OCAF之TObj 模型
  4. VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)
  5. Boosting集合算法详解(一)
  6. 阿里P8大牛亲自教你!史上最全的Android面试题集锦,这原因我服了
  7. php下载文件添加header响应头
  8. php html登陆逻辑,保持演示文稿(HTML)和逻辑(PHP)分开
  9. 计算机网络学习笔记-目录(更新日期:2020.4.8)
  10. Python_代码练习_写一个判断是否为小数的函数
  11. 在Magento 2中自定义电子邮件模板
  12. 手把手教你写让人眼前一亮的软件测试简历,收不到面试邀请算我输
  13. 使用结构体输入参加某会议成员的信息,并计算男女比例C++
  14. 项目管理心得--第一篇
  15. 如何快速的将EXCEL表格数据拆分成多个文件
  16. 利用开源软件 Hugin 实现照片的景深合成
  17. 微信支付签名失败(几种解决方案)
  18. Android社招面经分享!2021华为Android高级面试题及答案,附相关架构及资料
  19. oracle设置session空闲时间超时断开
  20. (day9) 自学Java——常用API

热门文章

  1. delphi 实现屏幕旋转代码_代码检查 | 如何用Processing实现3D世界
  2. linux删除csv换行符,从CSV保存行删除换行符(Remove linefeed from csv preserving r
  3. php 传递resource参数,php define的第二个参数使用方法_php技巧 - is_resource
  4. recovery升级是显示进度条_注意!税控系统软件升级了,还有疑问看这里!
  5. 评论安装_再也不用手动复制粘贴收集Taptap游戏评论了,还可以制作好看的热词词云图~...
  6. Java学习笔记2.5.1 循环结构 - 条件循环
  7. 安卓学习笔记38:利用OpenGL ES绘制旋转立方体
  8. 大数据学习笔记08:Java程序访问HDFS
  9. 二级VB培训笔记06:窗体与常用控件综合案例【个人信息注册】
  10. 演示Go语言多返回值功能