概述

距离上次记录《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. Linux C语言多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

  2. 微服务(五)nacos配置管理

    1 统一配置管理 1.1 nacos中添加配置文件 注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要.基本不会变更的一些配置还是保存在微服务本地比较好. 1.2 从微服务拉取配置 微 ...

  3. 牛客网 剑指Offer 索引

    二维数组中的查找 替换空格 从尾到头打印链表 重建二叉树 用两个栈实现队列 旋转数组的最小数字 斐波那契数列 跳台阶 变态跳台阶 矩形覆盖 二进制中1的个数 数值的整数次方 调整数组顺序使奇数位于偶数 ...

  4. 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 ...

  5. SpringBoot教程(学习资源)

    SpringBoot教程 SpringBoot–从零开始学SpringBoot SpringBoot教程1 SpringBoot教程2 --SpringBoot教程2的GitHub地址 SpringB ...

  6. Labview一个循环中放两个事件结构会导致前面板锁定的问题

    建议在同一个循环中,只放置一个事件结构.此时,当一个事件发生时,事件结构将对事件进行处理,然后继续循环,事件结构再等待下一个事件发生. 如在同一个循环中放置两个事件结构,只有在两个事件结构都处理了事件 ...

  7. Spring一套全通4—持久层整合

    百知教育 - Spring系列课程 - 持久层整合 第一章.持久层整合 1.Spring框架为什么要与持久层技术进行整合 1. JavaEE开发需要持久层进行数据库的访问操作. 2. JDBC Hib ...

  8. ELK集群之grafana(8)

    Grafana的安装和读取ES数据 模拟es数据产生sjgtest.py import time import datetime from elasticsearch import Elasticse ...

  9. coding game, 边打游戏边学编程,是一种怎么样的体验?

    前言 hello,大家好,我是bigsai,好久不见,甚是想念! 在日常生活中,很多人喜欢玩游戏,因为游戏中有着对抗博弈.控制的喜悦,用灵魂指法完成一波靓丽的操作. 但实际上,你的按键都是对应代码中一 ...

  10. RabbitMQ保证消息的顺序性

    当我们的系统中引入了MQ之后,不得不考虑的一个问题是如何保证消息的顺序性,这是一个至关重要的事情,如果顺序错乱了,就会导致数据的不一致.       比如:业务场景是这样的:我们需要根据mysql的b ...