概述

距离上次记录《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. c 不同类型的指针

    今天看到了一个问题:c里面,不同类型的指针是否可以互指呢?也就是不同类型的指针之间是否可以互相赋值,我想了想,对于32位机子而言,所有类型的指针都是4Byte(64位就是8Byte,这里只讨论32位) ...

  2. 穿点最多的直线 牛客网 程序员面试金典 C++

    穿点最多的直线 牛客网 程序员面试金典 C++ 题目描述 在二维平面上,有一些点,请找出经过点数最多的那条线. 给定一个点集vectorp和点集的大小n,没有两个点的横坐标相等的情况,请返回一个vec ...

  3. Typora简介

    Typora是什么 Typora是一款支持实时预览的Markdown文本编辑器,拥有macOS.Windows.Linux三个平台的版本,并且完全免费. 下载地址:https://www.typora ...

  4. Mysql 5.7 集群部署,keepalived

    参考文章: https://blog.csdn.net/f18770366447/article/details/80703347 https://www.cnblogs.com/benjamin77 ...

  5. CentOS7自动备份oracle数据库

    1.环境 操作系统:CentOS 7 数据库:11.2.0.1.0 2.登录服务器 切换oracle用户,备份需要在oracle用户下进行 #su - oracle 在oracle家目录下创建bin目 ...

  6. openssh 8.2 升级 8.3

    openssh 8.2 存在安全漏洞,升级为 openssh 8.3 需要安装的包:openssh-8.3p1.tar.gz.zlib-1.2.11.tar.gz.openssl-1.1.1g.tar ...

  7. shell脚本 PHP+swoole的安装

    #!bin/bash set -e # Check if user is root if [ $(id -u) != "0" ]; then echo "Error: p ...

  8. django的增删改查

    前置条件: 已有一个model (tbl_user) ,用户表 1.查询 # 查询用户表 username是cx的数据 user_object = tbl_user.objects.filter(us ...

  9. 体验webhooks

    一.webhooks是什么 webhooks是一种实现在web api跟web service之间的发布订阅的轻量级的模式:当服务中心某个事件发生的时候,就会向订阅者发送一个POST请求形式的通知,这 ...

  10. Java学习(十)

    今天学习的是参数的传入,感觉这个和c++差不多. 传一个参数进去,要看这个参数是地址还是一个值,如果是值的话那无论在方法中如何加减,也只是另一个局部变量的事情了,与该参数无关,在原方法中参数的值保持不 ...