概述

距离上次记录《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的更多相关文章

  1. UE4之Slate:App默认窗口的创建流程

    UE4版本:4.24.3源码编译 Windows10 + VS2019开发环境 在先前分享的基础上,现在来梳理下App启动时默认窗口的创建流程,以及相关的类.对象之间的抽象层级: 纯C++工程配置 S ...

  2. UE4.25 Slate源码解读

    概述 Slate系统是UE的一套UI解决方案,UMG系统也是依赖Slate系统实现的. 问题: Slate系统是如何组织的? 控件树的父子关系是如何绑定的? Slate系统是如何渲染的? slate渲 ...

  3. UE4之Slate: App启动与最外层Runtime结构

    UE4版本:4.24.3源码编译: Windows10 + VS开发环境 Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL.DirectX这样的硬件加速AIP;可以理解为一个单独的2D图 ...

  4. UE4之Slate:纯C++工程配置

    概述: Slate是UE4提供的UI框架,整个UE4 Editor UI都是使用Slate构建的: Slate的官方文档:[Slate UI框架] Slate底层内容,中文环境下能搜索到的有效资源也不 ...

  5. 【UE4 C++】学习笔记汇总

    UE4 概念知识 基础概念--文件结构.类型.反射.编译.接口.垃圾回收.序列化[导图] GamePlay架构[导图] 类的继承层级关系[导图] 反射机制 垃圾回收机制/算法 序列化 Actor 的生 ...

  6. 【UE4 C++】Slate 初探: Editor UI 与 Game UI

    概述 名词区分 Slate Slate 是完全自定义.与平台无关的UI框架 应用 可用于编辑器UI,编辑器的大部分界面都是使用 Slate 构建的 可做为游戏UI 可作为独立应用开发 只能 C++ 开 ...

  7. UE4 Slate控件之TreeView 使用例子(一)

    TreeView例子 先从Contruct中往子Slot添加Widget,先声明指向STreeView的指针,后续方便进行视图的一些操作 TSharedPtr<STreeView<TSha ...

  8. 《Inside UE4》目录

    <Inside UE4>目录 InsideUE4 UE4无疑是非常优秀的世界上最顶尖的引擎之一,性能和效果都非常出众,编辑器工作流也非常的出色,更难得宝贵的是完全的开源让我们有机会去从中吸 ...

  9. UE4入门与精通

    由于目前在使用UE4引擎,多少也有一些心得,比如在日常使用中会遇到一些问题.坑(潜规则)或者一些使用技巧等.本人决定开一个大坑,主要有两个目的:一是可以自己做个记录,二是可以给大家提供一些参考吧.主要 ...

随机推荐

  1. Python爬虫之爬取淘女郎照片示例详解

    这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...

  2. 计算机网络之应用层概述(C/S模型与p2p模型)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105582318 学习课程:<2019王道考研计算机网络> 学习目的 ...

  3. 用python检查矩阵的计算

    鉴于最近复习线性代数计算量较大,且1800答案常常忽略一些逆阵.行列式的计算答案,故用Python写出矩阵的简单计算程序,便于检查出错的步骤. 1.行列式 可自行更改阶数 from numpy imp ...

  4. 攻防世界 杂项14.Erik-Baleog-and-Olaf

    下载解压后用notepad++打开 发现是一个PNG的图片文件,该后缀,再用Stegsolve打开看一下, 发现一个残缺二维码,果断在线PS补全 扫码得到flag flag{#justdiffit}

  5. Obsidian中使用Calendar插件快捷建立日记、周记

    Calendar插件 Calendar插件是我第一个安装使用的插件,插件可以帮助我们很便捷的记录每天的工作 插件效果图 插件下载 下载地址 插件安装 # Obsidian如何手动下载并安装插件-以看板 ...

  6. 【网络好文】---MySQL为Null导致的四大坑

    正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如所示: select version(); -- 版本为 8.0.22 "兵马未动粮草先行",看完了相关的配置之 ...

  7. (一)lamp 环境搭建之编译安装apache

    apache的编译安装: 安装步骤大概参考:http://www.cnblogs.com/iyoule/archive/2013/10/24/3385540.html 简单的将分为三步: (1)安装a ...

  8. Connected to an idle instance.

    Connected to an idle instance:连接到空闲实例 原因:数据库或者监听没启动

  9. Java不同时区(timezone)之间时间转换

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

  10. 【java+selenium3】线程休眠方法 (六)

    一.线程休眠的方法   Thread -- sleep 调用方式: Thread.sleep(long millis) 建议:不推荐使用此方式来等待,因为元素的实际渲染时间未知,长时间的等待则浪费的时 ...