UE4 c++ -- 简单的UMG
说明
学习一下如何将Widget蓝图与C++连接起来,将处理逻辑写在C++中
基础
在蓝图中,我们显示Widget是通过一个Actor或者PlayerController,甚至关卡蓝图,利用Create Widget以及 AddToViewPort使得Widget显示在屏幕上的
所以在C++中也是一样,一般来说由于Actor的销毁比如角色死亡,会导致其所有处理逻辑从内存中清除掉。所以将这个功能写在PlayerController类里。
现在为了演示,直接创建了一个Actor类和一个UserWidget类。
Actor类
其主要作用就是显示这个UMG界面,在.h文件中需要一个UserWidget类的指针,用来存储Create出来的对象。相当于上图中的那个变量
然后还需要接受一个类,一般通过TSubClassOf声明,然后在引擎中选择由UserWidget类创建好的蓝图类。相当于上图中CreateWidget模块的Class
//.h
public:
UPROPERTY()
class UXDebugMenuWidget* XDebugMenu;
UPROPERTY(EditAnywhere, Category = "Debug")
TSubclassOf<class UUserWidget> DebugMenuWdgClass;
在.cpp文件中就主要来实现上图中的逻辑
//.cpp
//Create Widget
XDebugMenu = CreateWidget<UXDebugMenuWidget>(GetWorld(), DebugMenuWdgClass);
if (XDebugMenu)
{
XDebugMenu->AddToViewport();
}
CreateWidget函数
在源码中其为一个函数模板,
template <typename WidgetT = UUserWidget, typename OwnerT = UObject>
WidgetT* CreateWidget(OwnerT* OwningObject, TSubclassOf<UUserWidget> UserWidgetClass = WidgetT::StaticClass(), FName WidgetName = NAME_None)
{
static_assert(TIsDerivedFrom<WidgetT, UUserWidget>::IsDerived, "CreateWidget can only be used to create UserWidget instances. If creating a UWidget, use WidgetTree::ConstructWidget.");
static_assert(TIsDerivedFrom<OwnerT, UWidget>::IsDerived
|| TIsDerivedFrom<OwnerT, UWidgetTree>::IsDerived
|| TIsDerivedFrom<OwnerT, APlayerController>::IsDerived
|| TIsDerivedFrom<OwnerT, UGameInstance>::IsDerived
|| TIsDerivedFrom<OwnerT, UWorld>::IsDerived, "The given OwningObject is not of a supported type for use with CreateWidget.");
SCOPE_CYCLE_COUNTER(STAT_CreateWidget);
if (OwningObject)
{
return Cast<WidgetT>(UUserWidget::CreateWidgetInstance(*OwningObject, UserWidgetClass, WidgetName));
}
return nullptr;
}
可以看到有两个信息
- 该函数只能创建UserWidget 对于UWidget需要其他函数
- OwingObject的类型只能是UWidget UWidgetTree APlayerController UGameInstance UWorld其中的一种,其他的类型无法调用该函数
所以当在Actor调用该函数生成Widget的时候,可以利用GetWorld()来得到UWorld类的参数,如果在PlayerController类中直接使用this指针即可
UserWidget类
参考
该类主要是处理UMG在蓝图中的逻辑。需要注意到点就是每个控件的声明是有严格的要求的,以Button控件为例
UPROPERTY(meta = (BindWidget))
class UButton* Button_Tab1;
- UPROPERTY(meta = (BindWidget))
BindWidget是一组专门用来绑定Button这些控件的枚举值中的一个UE官方文档 - 变量名称:C++中控件的名称必须和蓝图中一样
- 用BindWidget标记过的 widget 在 C++ 构造函数中为空,它们稍后在生命周期中被初始化。如果您需要进行类似构造函数的设置,请使用该NativeConstruct()函数。
- 对于按钮响应,可以调用官方设置好的委托函数广播即可OnClicked.AddDynamic(this,&Func);
使用HUD
使用HUD可以对一个GameMode设置使用一种UMG显示
GameMode是控制整个游戏的规则,相当于一种最高权限,可以设置玩家的控制器类型,默认角色类型,HUD类型等等。
当我们将将Widget放在HUD里面是,我们就可以通过GameMode来控制一些数值的显示,实际上是通过PlayerController来更改HUD的
可以将HUD理解为多个Widget的集合,我们将在HUD类里实现在Actor类中的创建Widget的操作。代码都是一样的,只不过OwingObject的类型我们需要修改为PlayerController,因为对于HUD类来说没有GetWorld对象,但其受到每个玩家控制器的控制,具有GetOwningPlayerController()函数来获取PlayerController。
然后就可以在PlayerController类里面使用HUD类对象调用HUD中的方法实现UMG的显示了。
UE4 c++ -- 简单的UMG的更多相关文章
- [UE4]最简单的虚幻4网络游戏,使用虚幻4内置服务器
一.设置游戏窗口合适的大小 二.在新窗口中运行游戏.玩家数量改成大于1. 三.运行游戏就会打开多个窗口 在打包完成的游戏中进行网络游戏: 一.虚幻4打包好的文件是放在WindowsNoEditor ...
- ue4 htcvivi简单配置
1 主角视口:相机与控制器挂载 Chaperone设置,主角bp上加上SteamVRChaperone用于提示用户可用区域边界 MotionController1里面选项设置为Right右手,然后下边 ...
- ue4 renderTexture简单记录
示例内容中的renderTexture 抓取部分 1 新建一个TextureRenderTarget2D 2 抓图 新建actor,一个camera,下面挂一个SceneCaptureComponen ...
- 移植UE4的模型操作到Unity中
最近在Unity上要写一个东东,功能差不多就是在Unity编辑器上的旋转,移动这些,在手机上也能比较容易操作最好,原来用Axiom3D写过一个类似的,有许多位置并不好用,刚好在研究UE4的源码,在模型 ...
- UE4高级功能--初探超大无缝地图的实现LevelStream
转自:http://blog.csdn.net/u011707076/article/details/44903223 LevelStream 实现超大无缝地图--官方文档学习 The Level S ...
- UE4/Unity3D中同时捕获多高清摄像头的高效插件
本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...
- UE4.5.0的Kinect插件(Plugin)---插件使用说明<二>
声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43563959 一.起因: 写了个UE4的Kinect的插件,结 ...
- Unreal学习笔记2-绘制简单三角形
目录 1. 概述 2. 详论 2.1. 代码实现 2.2. 解析:Component 2.3. 解析:材质 2.4. 解析:包围盒 2.5. 解析:Section 3. 其他 4. 参考 1. 概述 ...
- UE4使用UMG接口操作界面
原文链接:http://gad.qq.com/article/detail/7181131 本文首发腾讯GAD开发者平台,未经允许,不得转载 UE4的蓝图之强大让人欲罢不能,但是实际在项目的开发中,C ...
- UE4简单AI
首先做个小小的声明把,由于俺之前也没接触过AI ,所以有一些专业的词汇可能翻译存在各种问题,如果你发现的话,还是希望能够提出来哦,我们一起进步. 记住配合视频食用更佳哦~ 视频连接:http://ww ...
随机推荐
- Redhat7更改网易yum源
说明 之前写了一篇关于Redhat6更换Yum源的文章,时隔已久很多包都变了,正好最近搭建环境需要用到Redhat7.3所以就再记录一下如何更换为国内最新最常用的yum源. 操作步骤 1.卸载系统自带 ...
- oracle goto语句介绍
以下内容来自oracle plsql user guide. ------------------------------------------------------- 一 定义: The Ora ...
- win32-WH_KEYBOARD的使用
我们使用WH_KEYBOARD来禁用记事本的ALT的按键 .cpp #include <Windows.h> #include <stdio.h> #include <t ...
- FART 脱壳机原理分析
FART是一个基于Android 源码修改的脱壳机 可以脱整体壳和抽取壳 FART脱壳的步骤主要分为三步: 1.内存中DexFile结构体完整dex的dump 2.主动调用类中的每一个方法,并实现对应 ...
- 硬件开发笔记(十四):RK3568底板电路LVDS模块、MIPI模块电路分析、LVDS硬件接口、MIPI硬件接口详解
前言 本篇继续分析底板原理图mipi/lvds屏幕电路原理图.硬件接口详解. LVDS与MIPI的区别 液晶屏有RGB TTL.LVDS.MIPI.HDMI接口,这些接口区别于信号的类型( ...
- 项目实战:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111241205长期持续带来更多项目与技术分享, ...
- RabbitMQ零碎整理,总有一天在你工作中会用到
概念 MQ:消息队列(消息中间件),开源的基于AMQP协议的消息中间件,异步 解耦 削峰 核心作用:1.异步 2.解耦 3.消息通信 RabbitMQ 消息的类型:1.点对点 2.Worker 3.发 ...
- 第一百零一篇:DOM节点类型
好家伙, DOM DOM是javascript操作网页的接口,全称为文档对象模型(Document Object Model).它的作用是将网页转为一个javascript对象, 从而可以使用ja ...
- 固态硬盘使用f2fs作为根分区安装linux
目录 前言 碰到的问题 对策 我的实际操作步骤 0.警告 1. 准备 2. 分区 3. 使用网络安装debian10 4. 备份根分区 5. 修改固态硬盘linux根分区为f2fs 6.恢复备份 7. ...
- api网关介绍
1.什么是网关 API网关是一个系统的唯一入口. 是众多分布式服务唯一的一个出口. 它做到了物理隔离,内网服务只有通过网关才能暴露到外网被别人访问. 简而言之:网关就是你家的大门 2.提供了哪些功能 ...