原文链接:http://gad.qq.com/article/detail/7181131

本文首发腾讯GAD开发者平台,未经允许,不得转载

UE4的蓝图之强大让人欲罢不能,但是实际在项目的开发中,C++与蓝图都需要结合使用,单独选择一样开发都不是特别科学,这里我就来研究了一下C++使用UMG接口来操作界面,我的目的非常简单,用C++来创建界面,并在创建成功的时候,告诉界面打印出相关信息。

1.创建一个C++的空模板工程,命名UMGProject,用VS打开工程文件,找到UMGProject.Build.cs,在PublicDependencyModuleNames后面添加UMG模块,并取消PrivateDependencyModuleNames的注释,并编译工程。
using UnrealBuildTool;
public class UMGProject : ModuleRules
{
public UMGProject(TargetInfo Target)
{
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","UMG" }); PrivateDependencyModuleNames.AddRange(new string[] { }); // Uncomment if you are using Slate UI
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); // Uncomment if you are using online features
// PrivateDependencyModuleNames.Add("OnlineSubsystem"); // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
}
}

2.回到UE4的工程中,在Content下创建一个Blueprint的文件夹,在Blueprint下右键空白处点击选择User Interface/Wiget Blueprint,命名BP_UI
3.双击打开BP_UI,在中间添加一个Text控件,并设置为显眼一点的红色,并设置它的IsVariable为true,后面再创建函数的时候才方便使用。
4.并且我在BP_UI里面创建一个函数接口,在右上角点击Graph,添加一个Functions,命令为ShowMessage,功能就是用Text显示传送过来的信息。
5.在C++ Classes下面创建一个新的Class,继承自PlayerController,命名为UMGPlayerController,用VS打开后,我们需要在UMGPlayerController.h文件中的UCLASS里面添加Abstract和Blueprintable,UCLASS表示类修饰符,里面的参数是类具体的表述。
Abstract 类修饰符将类声明为“抽象基类”,这样会阻止用户在虚幻编辑器中向这个世界中添加这个类的Actor,或者在游戏过程中创建这个类的实例,而Blueprintable指定该类为创建蓝图的可接受基类。除非被继承,否则默认值为NotBlueprintable。它由子类继承。
同时在这个类中,我们还会用到一个函数修饰符,BlueprintImplementableEvent,表示此函数可以在蓝图或关卡蓝图图表内进行重载。这里就是用于C++与蓝图的交互接口,同时这个函数不用在cpp中再去实现它,完成后编译。
#include "GameFramework/PlayerController.h"
#include "UMGPlayerController.generated.h"
/**
*
*/
UCLASS(Abstract, Blueprintable)
class UMGPROJECT_API AUMGPlayerController : public APlayerController
{
GENERATED_BODY()
public:
/**此函数可以在蓝图或关卡蓝图图表内进行重载*/
UFUNCTION(BlueprintImplementableEvent, Category = "UMG")
void PrintMessage(const FString &Message);
};

6.在ue4中,Content/Blueprint下创建一个新的蓝图继承自上面所写的UMGPlayerController,命名为BP_UMGController。
7.我们再打开C++下面的UMGProjectGameMode,详细解释,都写在了注释中,主要在C++的顶上要添加UMG.h的头文件,在UMG.h包括了UMG整个模块的所有头文件,所以我们只添加它一个就可以了,在完成后,编译一下。
头文件:
#pragma once
#include "UMG.h"
#include "GameFramework/GameMode.h"
#include "UMGProjectGameMode.generated.h"
/**
*
*/
UCLASS()
class UMGPROJECT_API AUMGProjectGameMode : public AGameMode
{
GENERATED_BODY()
public:
AUMGProjectGameMode();
~AUMGProjectGameMode(); virtual void BeginPlay() override;
//获取菜单
UFUNCTION(BlueprintCallable, Category = "UMG")
UUserWidget* GetCountWidget(); protected:
//菜单
UPROPERTY()
UUserWidget* CountWidget;
//创建菜单
void CreateCountWidget();
};

源文件:

#include "UMGProject.h"
#include "UMGProjectGameMode.h"
#include "UMGPlayerController.h" AUMGProjectGameMode::AUMGProjectGameMode()
{
//通过路径找到蓝图,并将蓝图控制器的类设置给PlayerControllerClass
static ConstructorHelpers::FClassFinder<AUMGPlayerController> UMGControllerClassFinder(TEXT("/Game/Blueprint/BP_UMGController"));
PlayerControllerClass = UMGControllerClassFinder.Class; CreateCountWidget();
}
AUMGProjectGameMode::~AUMGProjectGameMode()
{
} void AUMGProjectGameMode::BeginPlay()
{
Super::BeginPlay();
//获取PlayerController并调用开始所写的PrintMessage函数
Cast<AUMGPlayerController>(GetWorld()->GetFirstPlayerController())->PrintMessage(TEXT("开始游戏~~~"));
} UUserWidget* AUMGProjectGameMode::GetCountWidget()
{
//返回计数界面
return CountWidget;
} void AUMGProjectGameMode::CreateCountWidget()
{
//通过路径找到蓝图
static ConstructorHelpers::FClassFinder<UUserWidget> UMGClassFinder(TEXT("/Game/Blueprint/BP_UI"));
//通过蓝图的类,创建菜单
CountWidget = CreateWidget<UUserWidget>(GetWorld(), UMGClassFinder.Class);
//添加到视图中
if (CountWidget != nullptr)
CountWidget->AddToViewport();
}

8.再打开ue4的BP_UMGController,点击Functions的Override,就会看到我们所写的PrintMessage
然后点击PrintMessage链接以下蓝图,就是在调用PrintMessage的时候,我们再去调用UI的ShowMessage,将传来的Message显示出来。
9.编译运行,运行顺序差不多就是在GameMode的构造函数里面设置PlayerController,然后通过路径找到并创建我们的BP_UI,然后再在BeginPlay里面输出文字信息。
感觉绕了一大圈,做了一个特别小的功能,不过这里主要也是为了表现C++使用UMG的接口,和C++调用蓝图的函数,在实际开发中C++与蓝图的交互是相当重要的。

UE4使用UMG接口操作界面的更多相关文章

  1. 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常

    在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...

  2. Node.js 中MongoDB的基本接口操作

    Node.js 中MongoDB的基本接口操作 连接数据库 安装mongodb模块 导入mongodb模块 调用connect方法 文档的增删改查操作 插入文档 方法: db.collection(& ...

  3. C#多线程操作界面控件的解决方案(转)

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  4. linux文本操作界面 vi面板如何复制一行

    linux文本操作界面 vi面板如何复制一行 1)把光标移动到要复制的行上2)按yy3)把光标移动到要复制的位置4)按p 在vi里如何复制一行中间的几个字符?如果你要从光标处开始复制 4 个字符,则先 ...

  5. Windows Auzre 微软的云计算产品的后台操作界面

    Windows Auzre 微软的云计算产品的后台操作界面,试用期,相比于阿里云后台操作不是人. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTmFvbG ...

  6. emWin洗衣机简易操作界面,含uCOS-III和FreeRTOS两个版本

    第3期:洗衣机简易操作界面 配套例子:V6-904_STemWin提高篇实验_洗衣机简易操作界面(uCOS-III)V6-905_STemWin提高篇实验_洗衣机简易操作界面(FreeRTOS) 例程 ...

  7. VC在线程中操作界面

    http://blog.csdn.net/tingsking18/article/details/4399199 多线程是我们在编程中经常遇到的问题,线程执行完后往往要把执行的结果传给主线程,但是MF ...

  8. Fiddler(二)Fiddler操作界面[工具条]和[底部状态面板]说明

    工具条说明 下面从左往右介绍一下每个按钮在工作中能起到什么作用,我这里是汉化版,所以顾名思义大家也能大概明白,并且鼠标在对应的图标上停留会有官方解释.下面再稍微补充一下 从第二个按钮说起,也就是小气泡 ...

  9. 解决Unity3D操作界面字体模糊的问题

    新装的电脑安装了UNITY后,操作界面的字体异常模糊,搜了半天看看有没有换字体的功能,也没找到 后来快放弃的时候,偶然看到这篇文章http://eyehere.net/2014/unity3d-int ...

随机推荐

  1. CBC翻转攻击(实验吧_简单的登陆题)

    题目链接 http://ctf5.shiyanbar.com/web/jiandan/index.php 有源码在test.php页面 分析代码过程 如果post id,将id转字符串,然后进入sql ...

  2. python三元操作符

    #比较大小更简单了 x,y=3987,24361 small=(x if x<y else y) print(small)   #方法一:比较三个数的大小找出较大的一个 x,y,z=8,1,13 ...

  3. Python3NumPy——数组(1)之创建

    开篇 numpy库作为科学计算的基础库,其地位相当重要,它是对数组操作的基石.它的存在使得线性代数以及矩阵论等相关知识在计算机上的表达更加方便与简单,集中体现出了人想办法,计算机去工作. Python ...

  4. CentOS安装node.js-8.11.1+替换淘宝NPM镜像

    注:以下所有操作均在CentOS 6.8 x86_64位系统下完成. #准备工作# 由于node.js-8.11.1在源码编译安装的时候需要gcc 4.9.4或clang++ 3.4.2以上版本的支持 ...

  5. 阿里移动云专场专题.md

    小激动 一年一度的阿里云栖大会是我们开发者的盛会,带着着激动的心情参加了这次开发者盛会,二话不说进入会场就被震感到了,先来张图聊表敬意. 主会场马云爸爸还是很有范的,将未来定义为无法定义,在这里宣布成 ...

  6. [LeetCode] Array Partition I 数组分割之一

    Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...

  7. 一.Kylin的伪分布式安装

    一.伪分布式安装kylin 2018年4月15日 15:06 安装需要的环境 1. hadoop集群环境:由于安装的是CDH5.14.0的版本,所以相关组件都是跟5.14.0相关 2. spark采用 ...

  8. testng中使用reportng报告

    1.pom.xml文件中添加依赖,重构一下项目(mvn compile) <dependency> <groupId>org.uncommons</groupId> ...

  9. python3全栈开发-什么是粘包、粘包现象、如何解决粘包

    一.粘包现象 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意注意: res=subprocess.Popen(cmd.decode( ...

  10. [HZOI 2015]疯狂的机器人

    [题目描述] 现在在二维平面内原点上有一只机器人 他每次操作可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格) 但是由于本蒟蒻施展的大魔法,机器人不能走到横坐标是负数或者纵坐标是负数 ...