UE4之Slate: SImage
概述
距离上次记录《UE4之Slate:纯C++工程配置》后已经好长时间了;
这个随笔来记录并分享一下SImage控件的使用,以在屏幕上显示一张图片;
目标
通过SImage控件的展示,学习Slate最基础的API使用
图文步骤
新建的C++工程,VS解决方案中,源码结构如下图:
图1:新建C++工程源码结构
新建一个C++ HUD类:
双击打开新建的工程文件:HelloSlate.uproject;这里使用编辑器的New C++ Class向导来添加HUD类;
编辑器菜单中:File->New C++ Class打开添加C++类向导界面;
勾选【Show All Class】,并在搜索栏中输入HUD,选中HUD作为父类;如图:

图2:选择HUD作为父类
点击【Next】,这里类名设为HelloSlateHUD,其他的保持默认,然后点击【Create Class】,如图:
图3:自定义HUD的类名
新的C++ HUD类创建后,VS工程会自动刷新并出现在VS的解决方案中,如下图:
图4:新建HelloSlateHUD后,VS源码结构
设置以使用自定义的HUD C++类
打开HelloSlateGameModeBase.h和HelloSlateGameModeBase.cpp源文件:
1 UCLASS()
2 class HELLOSLATE_API AHelloSlateGameModeBase : public AGameModeBase
3 {
4 GENERATED_BODY()
5 public:
6 AHelloSlateGameModeBase(const FObjectInitializer& ObjectInitializer); // 添加构造函数
7 };
1 #include "HelloSlateGameModeBase.h"
2 #include "HelloSlateHUD.h" // 包含新建的HUD头文件
3
4 // 构造函数
5 AHelloSlateGameModeBase::AHelloSlateGameModeBase(const FObjectInitializer& ObjectInitializer):
6 Super::AGameModeBase(ObjectInitializer)
7 {
8 HUDClass = AHelloSlateHUD::StaticClass(); // 设置为自定义的HUD C++类
9 }
因为工程使用空模板创建的,这里需要配置一下关卡:
1、Content中创建Maps目录
2、保存当前当前关卡到Maps目录下,命名为HelloSlate
3、设置当前关卡的GameMode为HelloSlateGameModeBase类
具体如图:
图5:关卡配置,以使用自定义的GameMode,进而使HelloSlateHUD生效
点击Play按钮,在Output Log中应该能看到“AHelloSlateHUD::BeginPlay()”Log输出;
显示图片
VS打开HelloSlateHUD.cpp源码,包含必要的头文件引用并修改后如下:
1 #include "HelloSlateHUD.h"
2 #include "Slate.h"
3 #include "Engine.h"
4
5 // 实现Actor的BeginPlay方法
6 void AHelloSlateHUD::BeginPlay()
7 {
8 Super::BeginPlay(); // 调用父类方法
9 UE_LOG(LogTemp, Warning, TEXT("AHelloSlateHUD::BeginPlay()"));
10
11 // 显示一个引擎自带的图片
12 if (GEngine && GEngine->GameViewport)
13 {
14 const FSlateBrush* icon = FCoreStyle::Get().GetBrush(TEXT("TrashCan"));
15 GEngine->GameViewport->AddViewportWidgetContent(SNew(SOverlay)
16 + SOverlay::Slot()
17 .HAlign(HAlign_Left)
18 .VAlign(VAlign_Top)
19 [
20 SNew(SImage)
21 .Image(icon)
22 ]
23 );
24 }
25 }
编译后在编辑器中Play,在游戏界面的左上角会显示一个垃圾桶图片;如图:
图6:运行效果
上述代码:
先是创建一个SOverlay对象;
再创建SImage对象,加到SOverlay Panel中,并设置水平、竖直方向的布局参数;
SOverlay对象最终通过GEngine->GameViewport->AddViewportWidgetContent(...)添加到“游戏画布”中
GameViewport是UGameViewportClient类的实例,有兴趣可以追一下源码;后面有时间再详述;
const FSlateBrush* icon取了引擎默认的资源,FSlateBrush、FCoreStyle后面涉及到渲染在聊;
对于当前的展示案例,这些暂时可以不用深究;
上述代码中的SNew宏和+ 、[]等操作符,可以参考下面这个文章:
UE4 Slate 特殊语法
结尾
以如何在界面上显示一个Image为例,详细的记录下C++中使用Slate最基础的流程;
以Step by step的这种方式,结合一些参考文章以及多些尝试,希望能带给UE4新手一些帮助。
UE4之Slate: SImage的更多相关文章
- UE4之Slate:App默认窗口的创建流程
UE4版本:4.24.3源码编译 Windows10 + VS2019开发环境 在先前分享的基础上,现在来梳理下App启动时默认窗口的创建流程,以及相关的类.对象之间的抽象层级: 纯C++工程配置 S ...
- UE4.25 Slate源码解读
概述 Slate系统是UE的一套UI解决方案,UMG系统也是依赖Slate系统实现的. 问题: Slate系统是如何组织的? 控件树的父子关系是如何绑定的? Slate系统是如何渲染的? slate渲 ...
- UE4之Slate: App启动与最外层Runtime结构
UE4版本:4.24.3源码编译: Windows10 + VS开发环境 Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL.DirectX这样的硬件加速AIP;可以理解为一个单独的2D图 ...
- UE4之Slate:纯C++工程配置
概述: Slate是UE4提供的UI框架,整个UE4 Editor UI都是使用Slate构建的: Slate的官方文档:[Slate UI框架] Slate底层内容,中文环境下能搜索到的有效资源也不 ...
- 【UE4 C++】学习笔记汇总
UE4 概念知识 基础概念--文件结构.类型.反射.编译.接口.垃圾回收.序列化[导图] GamePlay架构[导图] 类的继承层级关系[导图] 反射机制 垃圾回收机制/算法 序列化 Actor 的生 ...
- 【UE4 C++】Slate 初探: Editor UI 与 Game UI
概述 名词区分 Slate Slate 是完全自定义.与平台无关的UI框架 应用 可用于编辑器UI,编辑器的大部分界面都是使用 Slate 构建的 可做为游戏UI 可作为独立应用开发 只能 C++ 开 ...
- UE4 Slate控件之TreeView 使用例子(一)
TreeView例子 先从Contruct中往子Slot添加Widget,先声明指向STreeView的指针,后续方便进行视图的一些操作 TSharedPtr<STreeView<TSha ...
- 《Inside UE4》目录
<Inside UE4>目录 InsideUE4 UE4无疑是非常优秀的世界上最顶尖的引擎之一,性能和效果都非常出众,编辑器工作流也非常的出色,更难得宝贵的是完全的开源让我们有机会去从中吸 ...
- UE4入门与精通
由于目前在使用UE4引擎,多少也有一些心得,比如在日常使用中会遇到一些问题.坑(潜规则)或者一些使用技巧等.本人决定开一个大坑,主要有两个目的:一是可以自己做个记录,二是可以给大家提供一些参考吧.主要 ...
随机推荐
- Linux C语言多线程编程实例解析
Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...
- 微服务(五)nacos配置管理
1 统一配置管理 1.1 nacos中添加配置文件 注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要.基本不会变更的一些配置还是保存在微服务本地比较好. 1.2 从微服务拉取配置 微 ...
- 牛客网 剑指Offer 索引
二维数组中的查找 替换空格 从尾到头打印链表 重建二叉树 用两个栈实现队列 旋转数组的最小数字 斐波那契数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整数次方 调整数组顺序使奇数位于偶数 ...
- Python pylint requires Python '>=3.4.*' but the running Python is 2.7.12
用pylint 1.9.x 安装 pip install pylint==1.9.3. 或者换源 pip install -i https://pypi.tuna.tsinghua.edu.cn/si ...
- SpringBoot教程(学习资源)
SpringBoot教程 SpringBoot–从零开始学SpringBoot SpringBoot教程1 SpringBoot教程2 --SpringBoot教程2的GitHub地址 SpringB ...
- Labview一个循环中放两个事件结构会导致前面板锁定的问题
建议在同一个循环中,只放置一个事件结构.此时,当一个事件发生时,事件结构将对事件进行处理,然后继续循环,事件结构再等待下一个事件发生. 如在同一个循环中放置两个事件结构,只有在两个事件结构都处理了事件 ...
- Spring一套全通4—持久层整合
百知教育 - Spring系列课程 - 持久层整合 第一章.持久层整合 1.Spring框架为什么要与持久层技术进行整合 1. JavaEE开发需要持久层进行数据库的访问操作. 2. JDBC Hib ...
- ELK集群之grafana(8)
Grafana的安装和读取ES数据 模拟es数据产生sjgtest.py import time import datetime from elasticsearch import Elasticse ...
- coding game, 边打游戏边学编程,是一种怎么样的体验?
前言 hello,大家好,我是bigsai,好久不见,甚是想念! 在日常生活中,很多人喜欢玩游戏,因为游戏中有着对抗博弈.控制的喜悦,用灵魂指法完成一波靓丽的操作. 但实际上,你的按键都是对应代码中一 ...
- RabbitMQ保证消息的顺序性
当我们的系统中引入了MQ之后,不得不考虑的一个问题是如何保证消息的顺序性,这是一个至关重要的事情,如果顺序错乱了,就会导致数据的不一致. 比如:业务场景是这样的:我们需要根据mysql的b ...