说明

学习一下如何将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. Linux实现指定用户sftp传输,静止ssh登录

    1.环境 名称 ip server 192.168.1.1 client 192.168.1.2 2.服务器创建repl用户 useradd -m -d /home/repl -s /usr/sbin ...

  2. pt-table-checksum对比数据测试(dsns方式)

    1.1.工作原理 pt-table-checksum会对校验的表数据进行数据块(数据块大小根据服务负载情况调整)划分,并对数据块数据进行checksun处理:存储在建立的表中.在主库中执行基于stat ...

  3. java zTree异步加载实战

    zTree简介 zTree 是一个依靠 jQuery 实现的多功能 "树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree 是开源免费的软件(MI ...

  4. PL/SQL相关的数据字典

    PL/SQL相关的数据字典 http://www.oracle.com/technetwork/issue-archive/2012/12-nov/o62plsql-1851968.html 有时候, ...

  5. Oracle 12c中增强的PL/SQL功能

    英文链接:http://www.oracle.com/technetwork/issue-archive/2013/13-sep/o53plsql-1999801.html Oracle 12c增强了 ...

  6. 协程与yield表达式

    在函数内,yield语句可以作为表达式使用,出现在赋值运算符的右边,例如: def receiver(): print("Ready to receive") while True ...

  7. linux下MariaDB安装

    一条命令安装Mariadb 首先在/etc/yum.repos.d下创建一个MariaDB.repo文件 vim /etc/yum.repos.d/MariaDB.repo 添加以下配置 [maria ...

  8. 记录一个错误:Traceback (most recent call last): from pip._internal.cli.main import main ImportError: No module named pip._internal.cli.main

    问题描述 在安装yaml时得到报错如下 root@ag-virtual-machine:/home/ag/test_script# pip install pyyaml Traceback (most ...

  9. 【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常

    问题描述 在Java项目中,使用Redisson作为连接Redis的客户端,间歇性的出现了DNS Monitor throwable 错误. DNSMonitor throwable="ja ...

  10. 【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间

    问题描述 C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间? Redis维护说明: Redis 服务维护时,会把副本节点提升为主节点,且旧主节点关闭现有连接时,这个时候, ...