说明

学习一下如何将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;
}

可以看到有两个信息

  1. 该函数只能创建UserWidget 对于UWidget需要其他函数
  2. OwingObject的类型只能是UWidget UWidgetTree APlayerController UGameInstance UWorld其中的一种,其他的类型无法调用该函数

    所以当在Actor调用该函数生成Widget的时候,可以利用GetWorld()来得到UWorld类的参数,如果在PlayerController类中直接使用this指针即可

UserWidget类

参考

该类主要是处理UMG在蓝图中的逻辑。需要注意到点就是每个控件的声明是有严格的要求的,以Button控件为例

UPROPERTY(meta = (BindWidget))
class UButton* Button_Tab1;
  1. UPROPERTY(meta = (BindWidget))

    BindWidget是一组专门用来绑定Button这些控件的枚举值中的一个UE官方文档
  2. 变量名称:C++中控件的名称必须和蓝图中一样
  3. 用BindWidget标记过的 widget 在 C++ 构造函数中为空,它们稍后在生命周期中被初始化。如果您需要进行类似构造函数的设置,请使用该NativeConstruct()函数。
  4. 对于按钮响应,可以调用官方设置好的委托函数广播即可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的更多相关文章

  1. [UE4]最简单的虚幻4网络游戏,使用虚幻4内置服务器

    一.设置游戏窗口合适的大小 二.在新窗口中运行游戏.玩家数量改成大于1.   三.运行游戏就会打开多个窗口 在打包完成的游戏中进行网络游戏: 一.虚幻4打包好的文件是放在WindowsNoEditor ...

  2. ue4 htcvivi简单配置

    1 主角视口:相机与控制器挂载 Chaperone设置,主角bp上加上SteamVRChaperone用于提示用户可用区域边界 MotionController1里面选项设置为Right右手,然后下边 ...

  3. ue4 renderTexture简单记录

    示例内容中的renderTexture 抓取部分 1 新建一个TextureRenderTarget2D 2 抓图 新建actor,一个camera,下面挂一个SceneCaptureComponen ...

  4. 移植UE4的模型操作到Unity中

    最近在Unity上要写一个东东,功能差不多就是在Unity编辑器上的旋转,移动这些,在手机上也能比较容易操作最好,原来用Axiom3D写过一个类似的,有许多位置并不好用,刚好在研究UE4的源码,在模型 ...

  5. UE4高级功能--初探超大无缝地图的实现LevelStream

    转自:http://blog.csdn.net/u011707076/article/details/44903223 LevelStream 实现超大无缝地图--官方文档学习 The Level S ...

  6. UE4/Unity3D中同时捕获多高清摄像头的高效插件

    本文主要讲实现过程的一些坑. 先说下要实现的目标,主要功能在UE4/Unity中都要用,能同时捕获多个摄像头,并且捕获的图片要达到1080p25桢上,并且需要经过复杂的图片处理后丢给UE4/Unity ...

  7. UE4.5.0的Kinect插件(Plugin)---插件使用说明<二>

    声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/43563959 一.起因: 写了个UE4的Kinect的插件,结 ...

  8. Unreal学习笔记2-绘制简单三角形

    目录 1. 概述 2. 详论 2.1. 代码实现 2.2. 解析:Component 2.3. 解析:材质 2.4. 解析:包围盒 2.5. 解析:Section 3. 其他 4. 参考 1. 概述 ...

  9. UE4使用UMG接口操作界面

    原文链接:http://gad.qq.com/article/detail/7181131 本文首发腾讯GAD开发者平台,未经允许,不得转载 UE4的蓝图之强大让人欲罢不能,但是实际在项目的开发中,C ...

  10. UE4简单AI

    首先做个小小的声明把,由于俺之前也没接触过AI ,所以有一些专业的词汇可能翻译存在各种问题,如果你发现的话,还是希望能够提出来哦,我们一起进步. 记住配合视频食用更佳哦~ 视频连接:http://ww ...

随机推荐

  1. Redhat7更改网易yum源

    说明 之前写了一篇关于Redhat6更换Yum源的文章,时隔已久很多包都变了,正好最近搭建环境需要用到Redhat7.3所以就再记录一下如何更换为国内最新最常用的yum源. 操作步骤 1.卸载系统自带 ...

  2. oracle goto语句介绍

    以下内容来自oracle plsql user guide. ------------------------------------------------------- 一 定义: The Ora ...

  3. win32-WH_KEYBOARD的使用

    我们使用WH_KEYBOARD来禁用记事本的ALT的按键 .cpp #include <Windows.h> #include <stdio.h> #include <t ...

  4. FART 脱壳机原理分析

    FART是一个基于Android 源码修改的脱壳机 可以脱整体壳和抽取壳 FART脱壳的步骤主要分为三步: 1.内存中DexFile结构体完整dex的dump 2.主动调用类中的每一个方法,并实现对应 ...

  5. 硬件开发笔记(十四):RK3568底板电路LVDS模块、MIPI模块电路分析、LVDS硬件接口、MIPI硬件接口详解

    前言   本篇继续分析底板原理图mipi/lvds屏幕电路原理图.硬件接口详解.   LVDS与MIPI的区别   液晶屏有RGB TTL.LVDS.MIPI.HDMI接口,这些接口区别于信号的类型( ...

  6. 项目实战:Qt+Arm+Fpga医疗肾镜(又名内窥镜)(实时影像、冻结、拍照、白平衡、九宫格、录像、背光调整、硬件光源调整、光源手动自动调整、物理按键)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111241205长期持续带来更多项目与技术分享, ...

  7. RabbitMQ零碎整理,总有一天在你工作中会用到

    概念 MQ:消息队列(消息中间件),开源的基于AMQP协议的消息中间件,异步 解耦 削峰 核心作用:1.异步 2.解耦 3.消息通信 RabbitMQ 消息的类型:1.点对点 2.Worker 3.发 ...

  8. 第一百零一篇:DOM节点类型

    好家伙,   DOM DOM是javascript操作网页的接口,全称为文档对象模型(Document Object Model).它的作用是将网页转为一个javascript对象, 从而可以使用ja ...

  9. 固态硬盘使用f2fs作为根分区安装linux

    目录 前言 碰到的问题 对策 我的实际操作步骤 0.警告 1. 准备 2. 分区 3. 使用网络安装debian10 4. 备份根分区 5. 修改固态硬盘linux根分区为f2fs 6.恢复备份 7. ...

  10. api网关介绍

    1.什么是网关 API网关是一个系统的唯一入口. 是众多分布式服务唯一的一个出口. 它做到了物理隔离,内网服务只有通过网关才能暴露到外网被别人访问. 简而言之:网关就是你家的大门 2.提供了哪些功能 ...