作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏UI,故我们创建两个Widget。

  1.GameHUDWidget:负责游戏中界面UI的整体显示

  2.ShortcutWidget:负责快捷栏部件的显示与逻辑

然后我们通过以下步骤依次创建显示快捷栏UI:

  01.创建ShortcutWidget快捷栏组件:存储容器逻辑、界面布局、样式、初始化

ShortcutWidget.h:

 1 // Fill out your copyright notice in the Description page of Project Settings.
2
3 #pragma once
4
5 #include "CoreMinimal.h"
6 #include "Data/SDTypes.h"
7
8 #include "Widgets/SCompoundWidget.h"
9
10 struct FSDGameStyle;
11 class STextBlock;
12 class SUniformGridPanel;
13
14 /**
15 *
16 */
17 class SANDBOXGAME_API SSDShortcutWidget : public SCompoundWidget
18 {
19 public:
20 SLATE_BEGIN_ARGS(SSDShortcutWidget)
21 {}
22 SLATE_END_ARGS()
23
24 /** Constructs this widget with InArgs */
25 void Construct(const FArguments& InArgs);
26
27 virtual void Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime) override;
28
29 public:
30 // 创建委托变量
31 FRegisterShortcutContainer RegisterShortcutContainer;
32
33 private:
34 // 初始化所有容器
35 void InitContainer();
36
37 private:
38 // 获取GameWidgetStyle
39 const FSDGameStyle* GameStyle;
40
41 // 物品名字指针
42 TSharedPtr<STextBlock> shortcutInfoTextBlock;
43
44 // 网格指针
45 TSharedPtr<SUniformGridPanel> GridPanel;
46
47 // 是否初始化容器
48 bool IsInitContainer;
49
50 };

ShortcutWidget.cpp:构造函数(获取样式蓝图实例、UI布局、初始化变量)、Tick指针中检查初始化、InitializeContainer(更新快捷栏函数,实现单个快捷框UI绘制、变量new赋值)

 1 #include "UI/Widget/SSlAiShortcutWidget.h"
2 #include "SlateOptMacros.h"
3 #include "SlAiStyle.h"
4 #include "SlAiGameWidgetStyle.h"
5 #include "SBox.h"
6 #include "SOverlay.h"
7 #include "STextBlock.h"
8 #include "SUniformGridPanel.h"
9 #include "SBorder.h"
10
11 BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
12 void SSlAiShortcutWidget::Construct(const FArguments& InArgs)
13 {
14 // 获取 GameStyle
15 GameStyle = &SlAiStyle::Get().GetWidgetStyle<FSlAiGameStyle>("BPSDGameStyle");
16
17 ChildSlot
18 [
19 SNew(SBox)
20 .WidthOverride(900.f)
21 .HeightOverride(160.f)
22 [
23 SNew(SOverlay)
24
25 +SOverlay::Slot()
26 .HAlign(HAlign_Center)
27 .VAlign(VAlign_Top)
28 [
29 SAssignNew(ShortcutInfoTextBlock, STextBlock)
30 .Font(GameStyle->Font_Outline_40)
31 .ColorAndOpacity(GameStyle->FontColor_White)
32 ]
33
34 +SOverlay::Slot()
35 .HAlign(HAlign_Fill)
36 .VAlign(VAlign_Fill)
37 .Padding(FMargin(0.f, 60.f, 0.f, 0.f))
38 [
39 SAssignNew(GridPanel, SUniformGridPanel)
40 ]
41 ]
42 ];
43
44 // 设置没有初始化容器
45 IsInitializeContainer = false;
46 }
47 END_SLATE_FUNCTION_BUILD_OPTIMIZATION
48
49 void SSlAiShortcutWidget::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)
50 {
51 if (!IsInitializeContainer) {
52 InitializeContainer();
53 IsInitializeContainer = true;
54 }
55 }
56
57 void SSlAiShortcutWidget::InitializeContainer()
58 {
59 for (int i = 0; i < 9; ++i) {
60 // 创建容器
61 TSharedPtr<SBorder> ContainerBorder;
62 TSharedPtr<SBorder> ObjectImage;
63 TSharedPtr<STextBlock> ObjectNumText;
64
65 SAssignNew(ContainerBorder, SBorder)
66 .Padding(FMargin(10.f))
67 // 供测试用,待删除
68 .BorderImage(&GameStyle->NormalContainerBrush)
69
70 [
71 SAssignNew(ObjectImage, SBorder)
72 .HAlign(HAlign_Right)
73 .VAlign(VAlign_Bottom)
74 .Padding(FMargin(0.f, 0.f, 5.f, 0.f))
75 // 供测试用,待删除
76 .BorderImage(&GameStyle->EmptyBrush)
77
78 [
79 SAssignNew(ObjectNumText, STextBlock)
80 .Font(GameStyle->Font_Outline_20)
81 .ColorAndOpacity(GameStyle->FontColor_Black)
82 // 供测试用,待删除
83 .Text(FText::FromString("12"))
84
85 ]
86 ];
87
88 GridPanel->AddSlot(i, 0)
89 [
90 ContainerBorder->AsShared()
91 ];
92 }
93 }

  02.添加快捷栏UI组件的样式:在GameStyle.h文件中添加样式接口、在蓝图中创建GameStyle的蓝图然后选中样式

SlAiGameStyle.h:添加样式接口

  1 // Fill out your copyright notice in the Description page of Project Settings.
2
3 #pragma once
4
5 #include "CoreMinimal.h"
6 #include "Styling/SlateWidgetStyle.h"
7 #include "Styling/SlateWidgetStyleContainerBase.h"
8
9 #include "SDGameWidgetStyle.generated.h"
10
11 /**
12 *
13 */
14 USTRUCT()
15 struct SANDBOXGAME_API FSDGameStyle : public FSlateWidgetStyle
16 {
17 GENERATED_USTRUCT_BODY()
18
19 FSDGameStyle();
20 virtual ~FSDGameStyle();
21
22 // FSlateWidgetStyle
23 virtual void GetResources(TArray<const FSlateBrush*>& OutBrushes) const override;
24 static const FName TypeName;
25 virtual const FName GetTypeName() const override { return TypeName; };
26 static const FSDGameStyle& GetDefault();
27
28 // 添加笔刷
29 /*
30 * 快捷栏容器Brush
31 */
32 UPROPERTY(EditAnywhere, Category = "Package")
33 FSlateBrush NormalContainerBrush;
34
35 /*
36 * 快捷栏被选中时Brush
37 */
38 UPROPERTY(EditAnywhere, Category = "Package")
39 FSlateBrush ChoosedContainerBrush;
40
41 /*
42 * 空Brush
43 */
44 UPROPERTY(EditAnywhere, Category = "Package")
45 FSlateBrush EmptyBrush;
46
47 // 物品笔刷
48 UPROPERTY(EditAnywhere, Category = "Package")
49 FSlateBrush ObjectBrush_1;
50 UPROPERTY(EditAnywhere, Category = "Package")
51 FSlateBrush ObjectBrush_2;
52 UPROPERTY(EditAnywhere, Category = "Package")
53 FSlateBrush ObjectBrush_3;
54 UPROPERTY(EditAnywhere, Category = "Package")
55 FSlateBrush ObjectBrush_4;
56 UPROPERTY(EditAnywhere, Category = "Package")
57 FSlateBrush ObjectBrush_5;
58 UPROPERTY(EditAnywhere, Category = "Package")
59 FSlateBrush ObjectBrush_6;
60 UPROPERTY(EditAnywhere, Category = "Package")
61 FSlateBrush ObjectBrush_7;
62
63
64 // 添加样式
65 /*
66 * 白色颜色
67 */
68 UPROPERTY(EditAnywhere, Category = "Common")
69 FLinearColor FontColor_White;
70
71 /*
72 * 黑色颜色
73 */
74 UPROPERTY(EditAnywhere, Category = "Common")
75 FLinearColor FontColor_Black;
76
77 /*
78 * 60号字体
79 */
80 UPROPERTY(EditAnywhere, Category = "Common")
81 FSlateFontInfo Font_60;
82
83 /*
84 * 50号字体有轮廓
85 */
86 UPROPERTY(EditAnywhere, Category = "Common")
87 FSlateFontInfo Font_Outline_50;
88
89 /*
90 * 40号字体
91 */
92 UPROPERTY(EditAnywhere, Category = "Common")
93 FSlateFontInfo Font_40;
94
95 /*
96 * 40号字体有轮廓
97 */
98 UPROPERTY(EditAnywhere, Category = "Common")
99 FSlateFontInfo Font_Outline_40;
100
101 /*
102 * 30号字体
103 */
104 UPROPERTY(EditAnywhere, Category = "Common")
105 FSlateFontInfo Font_30;
106
107 /*
108 * 20号字体
109 */
110 UPROPERTY(EditAnywhere, Category = "Common")
111 FSlateFontInfo Font_20;
112
113 /*
114 * 20号字体有轮廓
115 */
116 UPROPERTY(EditAnywhere, Category = "Common")
117 FSlateFontInfo Font_Outline_20;
118
119 /*
120 * 16号字体有轮廓
121 */
122 UPROPERTY(EditAnywhere, Category = "Common")
123 FSlateFontInfo Font_Outline_16;
124
125 /*
126 * 16号字体
127 */
128 UPROPERTY(EditAnywhere, Category = "Common")
129 FSlateFontInfo Font_16;
130
131
132 };
133
134 /**
135 */
136 UCLASS(hidecategories=Object, MinimalAPI)
137 class USDGameWidgetStyle : public USlateWidgetStyleContainerBase
138 {
139 GENERATED_BODY()
140
141 public:
142 /** The actual data describing the widget appearance. */
143 UPROPERTY(Category=Appearance, EditAnywhere, meta=(ShowOnlyInnerProperties))
144 FSDGameStyle WidgetStyle;
145
146 virtual const struct FSlateWidgetStyle* const GetStyle() const override
147 {
148 return static_cast< const struct FSlateWidgetStyle* >( &WidgetStyle );
149 }
150 };

ue蓝图:创建样式蓝图

配置样式

  03.在GameHUDWidget中添加快捷栏控件ShortcutWidget指针,并根据窗口宽度自动调节快捷栏控件大小

GameHUDWidget.h:添加快捷栏控件指针、获取屏幕Size函数、大小变更绑定函数GetUIScaler()

GameHUDWidget.cpp:编辑GameHUD界面(绑定大小自适应函数、组织控件排布)、对应功能函数实现

  04.将GameHUDWidget添加进视口:在GameHUD文件中添加GameHUDWidget控件.

GameHUDWidget.h:添加Widget组件指针

GameHUDWidget.cpp:添加组件到视口

  

最终显示效果

UE4纯C++实现游戏快捷栏之创建快捷栏UI的更多相关文章

  1. 判读是不是对象字面量(纯对象)。对象字面量创建方式有{}、new Object()创建

    //判读是否是自身属性 function isHasPro(obj,pro){ return obj.hasOwnProperty(pro) ? true : false; } //判读是不是对象字面 ...

  2. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

    概述: UI即User Interface(用户界面)的简称.UI设计是指对软件的燃机交互.操作逻辑.界面美观的整体设计.好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏整 ...

  3. 使用WPF来创建 Metro UI程序

    本文转载:http://www.cnblogs.com/TianFang/p/3184211.html 这个是我以前网上看到的一篇文章,原文地址是:Building a Metro UI with W ...

  4. 【ASP.NET Web API教程】2.3.5 用Knockout.js创建动态UI

    原文:[ASP.NET Web API教程]2.3.5 用Knockout.js创建动态UI 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容 ...

  5. Qt基础——让使用Designer创建的UI也能自动适应窗口大小

    原文请看:http://www.cnblogs.com/linmeng/archive/2012/07/05/2559259.html 我们知道,通过Qt的各种Layout可以实现控件的自动布局. 但 ...

  6. 用swift创建各种UI控件【iSwifting社区】

    为了方便大家学习,www.iSwifting.com社区为大家准备了创建各种UI控件的代码.開始看着语法可能有些别扭,当用习惯了,就认为还是非常不错的. 社区还添加了问答专区.有问题的朋友.虽然问.大 ...

  7. 使用UE4公布安卓平台游戏

    使用了几天的UE4 ,总算是将游戏在安卓平台执行起来了.当中遇到非常多问题,而且终于依旧有一些问题没能解决. 整体感觉是UE4这款引擎眼下还不够成熟.问题较多. 没有unity使用起来方便. 可是既然 ...

  8. IOS 2D游戏开发框架 SpriteKit-->续(创建敌对精灵)

    这次包括之后讲的spritekit 我都会围绕一个案例来说,这个案例就是一个简单的2d飞机大战游戏,今天这里我讲创建敌对精灵,就是敌对飞机,敌对飞机不停的被刷新到屏幕上.....当然这里涉及到的类其实 ...

  9. UE4开发神秘海域类游戏原型 初阶(二):动画资源的整合

    前一篇已经确定神海类游戏原型的目标,首先要做的就是3C's(Character, Controls, Camera)的开发.   UE4的3C's的程序部分开发主要也就是基于他的GamePlay Fr ...

  10. UE4 Windows平台部署游戏到IOS 第一部分

    UE4 Version 4.11.2 or 4.12.2 方法步骤: 1.申请IOS开发者账号,大概三个工作日左右激活. 2.下载iTunes 3.创建项目因为是在Windows平台,根据官方的提示只 ...

随机推荐

  1. milvus 结果

    milvus (2.3.3) 两个查询方法 collection.query(...) 和 collection.search(...) 的返回类型是不同的,用错了会说 attribute error ...

  2. brpc linux 下编译构建

    brpc 在 linux 下编译构建,比在 mac 下还要更复杂些,mac 下可以走官方说明编译成功,过程中也需要进行一些配置调整. 在 linux 通过 bazel 最终实现了 brpc 编译通过. ...

  3. 使用分布式锁解决IM聊天数据重复插入的问题

    导航 业务背景 问题分析与定位 探索可行的解决方案 数据库层面处理--唯一索引 应用程序层面处理--分布式锁 分布式锁概述 分布式锁需要具备哪些特性? 分布式锁有哪些实现方式? 基于数据库的实现方式 ...

  4. Python中的分布式框架Ray的安装与使用

    技术背景 假设我们在一个局域网内有多台工作站(不是服务器),那么有没有一个简单的方案可以实现一个小集群,提交分布式的任务呢?Ray为我们提供了一个很好的解决方案,允许你通过conda和Python灵活 ...

  5. Mac m1 安装 scrcpy

    前提:已经安装 brew 1. 设定 HOMEBREW_BOTTLE_DOMAIN(不设定的时候 ,会遇到报错  Bottle missing, falling back to the default ...

  6. 十种SQL的语法

    一.ORDER BY FIELD()自定义排序逻辑 ORDER BY FIELD(str,str1,...) 自定义排序sql如下: SELECT * from order_diy ORDER BY ...

  7. Spring —— 事务角色&&事务属性

    事务角色 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法       事务属性:    事务传播行 ...

  8. Tomcat——IDEA中创建 Maven Web 项目

    IDEA中创建 Maven Web 项目    首先创建一个新的空项目        1.使用骨架      新建模块-找到如下骨架-创建              删除pom.xml中多余的坐标   ...

  9. OxyPlot公共属性一览

    一.PlotModel 1.构造函数中设置的属性 public PlotModel() { this.Axes = new ElementCollection(this); //坐标轴集合; this ...

  10. linux内核调试痛点之函数参数抓捕记

    1.linux内核调试工具crash并不能直接显示函数参数,而这个对调试又非常重要 下面是工作中一个实际的问题,我们的进程hang在如下一个内核栈中了,通过栈回溯可知是打开了一个nfs3的网盘文件或者 ...