这里演示在UE4中UMG使用和C++代码操作Widget对象的示例。实现的功能有:
- 如何在widget蓝图中制作UI模版;
- 如何用C++动态加载资源(UTexture2D);
- 当触发widget组件的事件时如何调用C++函数;
例子的完整工程(包括所有代码)在文章末尾下载。
这个例子的部分代码参考自UE4官方项目的源码,有兴趣深入研究可以去看那些UI比较丰富的官方项目。
注:当前使用的是最新版本v4.10。下面的代码涉及的API可能在后续版本中变动,注意下。
具体步骤:
1,先新建一个空的C++工程
2,然后我们新建一个自己的PlayerController:工程编辑器中的点击File -》 new C++ class -》 选择Player Controller -》 下一步 -》 起一个类名:MyPlayerController
自定义PlayerController是为了添加角色控制的逻辑,每个游戏都有特定的角色(可以是3d人身角色,也可以是一个2d面板),所以一个正常的游戏都会需要添加自己的PlayerController,当前例子没有角色,这里添加PlayerController是为了将后面的UMG widget实例加入到PlayerController中。
我们先在PlayerController构造函数中添加一些配置代码,来实现鼠标显示,默认是不显示:
AMyPlayerController::AMyPlayerController()
{
//显示鼠标
bShowMouseCursor = true;
DefaultMouseCursor = EMouseCursor::Crosshairs;
//启用鼠标事件
bEnableClickEvents = true;
bEnableMouseOverEvents = true;
}
3,再GameMode类的构造函数中,设置默认的PlayerController为刚刚我们新建的PlayerController:
UMGDemoGameMode.h
// Fill out your copyright notice in the Description page of Project Settings.
#include "UMGDemo.h"
#include "UMGDemoGameMode.h"
#include "MyPlayerController.h"
AUMGDemoGameMode::AUMGDemoGameMode()
{
//使用自定义PlayerController类
PlayerControllerClass = AMyPlayerController::StaticClass();
}
4,再新建一个自定义的UBlueprintFunctionLibrary,这个类是一个提供各种通用的静态函数的管理类,我们将在这个类中实现一个获取自定义PlayerController的静态函数。工程编辑器中的点击File -》 new C++ class -》 勾选Show All Classes -》 找到BlueprintFunctionLibrary并选中 -》 下一步 -》 类名我们起为:MyBlueprintFunctionLibrary
添加完毕后会自动编译,这里会提示需要在编辑器中重新Compile编译一次,否则编辑器的内容视图中看不到这个文件,这个窗口我们先关掉,后面会统一编译
5,在“工程名.h”头文件加入我们刚刚新建的BlueprintFunctionLibrary:
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "Engine.h"
#include "MyBlueprintFunctionLibrary.h"
并实现一个静态的函数用于获取自定义PlayerController:
MyBlueprintFunctionLibrary.h
public:
/** 获取所有PlayerController列表,然后再找到本地客户端的第一个PlayerController并返回 */
UFUNCTION(BlueprintCallable, Category = "TD_Test Gameplay")
static APlayerController* GetLocalPlayerController(UObject* WorldContextObject);