一、基础UI

UMG全程叫做Unreal Motion Graphics UI Designer,是一种开发UI的工具。使用Unreal来进行UI开发,主要有两种方式,一种是Slate,另一种就是UMG,UMG是对Slate的一种包装。使用Slate进行UI开发,难度还是非常大的,需要使用C++来进行页面设计,调试非常不方便。UMG对初级开发者就非常的友好,一种所见即所得的开发模式,逻辑也可以直接使用蓝图进行编写。

虚幻引擎中分类分为两类:第一类是2DUI也就是显示在平面上的UI界面,第二类是3DUI显示在3D空间上的3D界面。

2DUI:屏幕上看到的一些文字数字等

3DUI:3D空间上的UI


两者区别:

2DUI创建方式为:creatwidget节点

3DUI的创建方式是,先创建Actor,将Widget以组件的方式加载到Actor里面

二、常用的UI空间button、image、text

第一部分:Anchors锚点可以设置控件的对其方式和锚点位置,尺寸大小等

第二部分:Appearance外观可以设置控件的图片样式,正常的样式,点击的样式,放上去的样式,点击的声音等,每个控件都有自己的样式,可以根据自己的喜好设置

第三部分:点击事件可以通过点击来实现不通的功能

三、案例

创建C++接口 interface命名为StateInterface

在C++里面写两个接口

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "StateInterface.generated.h"// This class does not need to be modified.
UINTERFACE(MinimalAPI)
class UStateInterface : public UInterface
{GENERATED_BODY()
};/*** */
class NEWOBJECT_API IStateInterface
{GENERATED_BODY()// Add interface functions to this class. This is the class that will be inherited to implement this interface.
public:virtual void EnterState() = 0;virtual void ExitState() = 0;
};

C++创建UserWidget命名为BaseStateWidget

继承接口,重写虚函数

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "StateInterface.h"
#include "BaseStateWidget.generated.h"/*** */
UCLASS()
class NEWOBJECT_API UBaseStateWidget : public UUserWidget,public IStateInterface
{GENERATED_BODY()public:virtual void EnterState() override;virtual void ExitState() override;UFUNCTION(BlueprintNativeEvent,BlueprintCallable,Category = "State Pattern")void OnEnterState();UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "State Pattern")void OnExitState();
};
// Fill out your copyright notice in the Description page of Project Settings.#include "BaseStateWidget.h"void UBaseStateWidget::EnterState()
{OnEnterState();
}void UBaseStateWidget::ExitState()
{OnExitState();
}void UBaseStateWidget::OnEnterState_Implementation()
{AddToViewport();
}void UBaseStateWidget::OnExitState_Implementation()
{RemoveFromParent();
}

C++创建Actor命名为UIStateManager

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "BaseStateWidget.h"
#include "Kismet/GameplayStatics.h"
#include "UIStateManager.generated.h"UCLASS()
class NEWOBJECT_API AUIStateManager : public AActor
{GENERATED_BODY()public:    // Sets default values for this actor's propertiesAUIStateManager();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:  // Called every framevirtual void Tick(float DeltaTime) override;UFUNCTION(BlueprintCallable, Category = "State Pattern")void EnterState(TSubclassOf<UBaseStateWidget> StateWidgetClass);UFUNCTION(BlueprintCallable, Category = "State Pattern")void ExitAllState();UPROPERTY(BlueprintReadWrite,Category = "State Pattern")UBaseStateWidget* CurrentStateWidget;private:TMap<TSubclassOf<UBaseStateWidget>,UBaseStateWidget*> WidgetIntsance;
};
// Fill out your copyright notice in the Description page of Project Settings.#include "UIStateManager.h"// Sets default values
AUIStateManager::AUIStateManager()
{// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.PrimaryActorTick.bCanEverTick = true;}// Called when the game starts or when spawned
void AUIStateManager::BeginPlay()
{Super::BeginPlay();}// Called every frame
void AUIStateManager::Tick(float DeltaTime)
{Super::Tick(DeltaTime);}void AUIStateManager::EnterState(TSubclassOf<UBaseStateWidget> StateWidgetClass)
{if (CurrentStateWidget != nullptr){CurrentStateWidget->ExitState();}if (WidgetIntsance.Contains(StateWidgetClass)){CurrentStateWidget = WidgetIntsance.FindRef(StateWidgetClass);}else{APlayerController* PC = UGameplayStatics::GetPlayerController(GetWorld(),0);CurrentStateWidget = CreateWidget<UBaseStateWidget>(PC,StateWidgetClass);WidgetIntsance.Add(StateWidgetClass,CurrentStateWidget);}CurrentStateWidget->EnterState();
}void AUIStateManager::ExitAllState()
{for (auto& Elem:WidgetIntsance){(Elem.Value)->ExitState();}
}

创建UMG继承自刚刚创建的BaseStateWidget

样式你可以自己设计

创建蓝图

打开

UE4 C++ UMG框架搭建相关推荐

  1. java 详解 搭建 框架_maven 基本框架搭建详解

    在平时的开发中还是在写blog时,在项目实例开始都会需要一遍一遍的介绍maven框架搭建,重复性的工作让我觉得烦恼,现在展现一下Java的核心思想"重复利用",将这个重复性的描述提 ...

  2. gvgai框架搭建及controller编写

    gvgai框架搭建及controller编写 gvgai框架搭建 controller编写 gvgai框架搭建 gvgai官网:http://www.gvgai.net/ 框架下载:http://ww ...

  3. [转载]SSH框架搭建详细图文教程

    什么是SSH? SSH对应 struts spring hibernatestruts 采用MVC模式,主要是作用于用户交互spring 采用IOC和AOP~作用比较抽象,是用于项目的松耦合hiber ...

  4. spring mvc + mybatis 框架搭建 ( idea + gradle)

    spring mvc + mybatis 框架搭建 idea + gradle 刚刚入门,只是个人见解,如有错误或者问题欢迎指出指正. 邮箱: [ wgh0807@qq.com ] 文章引用: [ap ...

  5. Angular开发实践(一):环境准备及框架搭建

    引言 在工作中引入Angular框架将近一年了,在这一年中不断的踩坑和填坑,当然也学习和积累了很多的知识,包括MVVM框架.前后端分离.前端工程化.SPA优化等等.因此想通过Angular开发实践这系 ...

  6. SSH框架搭建问题总结

    1.eclipse中tomcat配置是否正确?能否在网页中访问的到? 如何在eclipse中配置tomcat就不说了,我们看下问题,在网页上访问tomcat的地址,为什么出现404错误呢? 解决办法: ...

  7. React-Native 之 GD (一)目录结构与第三方框架使用与主题框架搭建

    1.APP效果图 2.工程环境配置 IOS: 将压缩包内的 Images.xcassets 文件夹直接替换掉我们iOS工程中的 Images.xcassets 文件夹. 这时候我们可以看到所有图片资源 ...

  8. (三) Angular2项目框架搭建心得

    前言: 在哪看到过angular程序员被React程序员鄙视,略显尴尬,确实Angular挺值得被调侃的,在1.*版本存在的几个性能问题,性能优化的"潜规则"贼多,以及从1.*到2 ...

  9. Unity 游戏框架搭建 (二十一) 使用对象池时的一些细节

    上篇文章使用SafeObjectPool实现了一个简单的Msg类.代码如下: class Msg : IPoolAble,IPoolType{#region IPoolAble 实现public vo ...

  10. 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】

    基于SpringMVC下的Rest服务框架搭建[1.集成Swagger] 1.需求背景 SpringMVC本身就可以开发出基于rest风格的服务,通过简单的配置,即可快速开发出一个可供客户端调用的re ...

最新文章

  1. 0x03.基本算法 — 前缀和与差分
  2. MPLS TE基本配置-OSPF
  3. bootstrap3中select2的默认值和下拉框的禁用
  4. 常用的函数式接口_Consumer接口
  5. BZOJ4589. Hard Nim
  6. Linux使用jstat命令查看jvm的GC情况
  7. 【软件工程】软件开发方法
  8. spring4.x(10)---依赖注入-构造方法注入
  9. GPIO应用开发方法【ZT】
  10. ubuntu19.04安装pip3以及virtualenv和virtualenvwrapper
  11. redis设置密码和其它服务器连接
  12. 红旗linux系统可以运行QQ吗,如何在红旗Linux系统redflag6.0上安装QQ
  13. 第1章 别让医生欺负你
  14. Flex与Ruby通过socket实现通简易文本聊天
  15. java程序dna,蓝桥杯——DNA(Java题解)
  16. 1991-2019年中国科技统计年鉴(EXCEL版)
  17. linux 进程 清理,Linux僵尸进程清除方法
  18. 小米android6.01 root,小米手机6详细刷成开发版开启root超级权限的教程
  19. linux 域名劫持,域名被劫持处理方案
  20. 一键还原的GHO文件夹打开方法(转载)

热门文章

  1. 构建MRCP服务器,使得FreeSWITCH基于mod_unimrcp与科大讯飞进行tts和asr通信
  2. [BZOJ]4987: Tree 树形DP
  3. 根据pc值确定出错的代码位置
  4. 零零信安:攻击面管理(ASM)技术详解和实现
  5. 谷歌(chrome)浏览器扩展程序
  6. K-th Largest Value
  7. 技术分享| 如何使用FFmpeg命令处理音视频
  8. Rollup-前端模块化打包工具入门
  9. 计算机的用户账户无法更改密码,windows不能更改密码怎么办【解决方法】
  10. 帝国php忘记密码,帝国cms7.5忘记登录密码以及多次登录失败被锁定终极解决办法-更新...