在游戏中使用Slate

Slate用户界面架构

概述

Slate控件可以用于在游戏中创建平头显示信息(HUD)或其他用户界面(UI)元素, 比如菜单。您一般可以创建一个或多个 容器 控件,每个容器可以包含几个其他类型的控件, 这些控件负责用户界面的特定方面。

比如,您可能具有一个针对游戏HUD的总体控件,同时具有针对主菜单、 选项菜单、暂停菜单、记分板等的各种控件。每种控件又可能由其他 自定义控件、标签、文本框、图片及其他类型的元素构成。

然后,可以根据游戏情境添加或删除这些容器控件:

  • 当游戏启动时,将添加主菜单控件。

  • 当他们选择菜单中的其中一个选项时 - 可能是启动游戏 - 那么主菜单控件将会被删除。

  • 如果玩家在任何时候暂停了游戏,那么将会添加暂停菜单控件。

  • 当游戏继续时,将会删除暂停菜单控件。

  • 当为玩家初始化了HUD时,将会添加HUD控件。

项目设置

为了使用Slate用户界面架构,您的项目必须进行适当的设置,以便它可以意识到该 架构。这允许您包含 Slate.h 头文件及引用使用Slate构建用户界面 所需的各种架构元素。

模块依赖

Slate架构存储在几个模块中。为了使您的项目意识到这些模块的存在, 则必须在 *.build.cs 文件中为您的项目设置一些依赖项。

您的项目需要访问的模块是:

模块 依赖类型
InputCore 公有
Slate 私有
SlateCore 私有

要想设置Slate模块的依赖项:

  1. 打开您的项目的 [ProjectName].build.cs 文件。它位于 [ProjectDir]/[ProjectName]/Source/[ProjectName] 目录中。

  2. 通过将 "InputCore" 添加到 PublicDependencyModuleNames 中,来添加InputCore公有依赖。

    PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

    当创建代码项目时,InputCore默认设置为公有依赖。

  3. 添加Slate和SlateCore私有依赖。*.build.cs文件中有一行代码用于添加私有依赖:

    PrivateDependencyModuleNames.AddRange(new string[] {  });

    您所需要做的就是将SlateCore和Slate模块添加到那行代码中:

    PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

    根据您创建项目的时机及其引擎版本的不同,它可能已经在 *.build.cs文件中设置了依赖项,但是注释掉了。您可以简单地取消注释适当的代码行来 设置依赖!

    // Uncomment if you are using Slate UI
    // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });

显示控件

为了在您的游戏中显示一个Slate控件,则必须将该控件添加到游戏视口中。重叠的控件 按照添加它们时指定的Z-排序进行排序,且较大的Z-排序值出现在较小的Z-排序值 的上面。

访问游戏视口

游戏视口是 GameViewportClient 类的一个实例。到当前游戏视口的引用可以通过 UEngine 的 GameViewport 成员获得,该成员可以通过使用到游戏当前UEngine实例 的GEngine 指针访问。

比如:

GEngine->GameViewport

因为 GEngine 和 GameViewport 都可以为 NULL ,所以在您尝试访问它们或者 其任何成员时,总是应该判断它们的值。

向视口中添加控件

Slate控件通过向 GameViewportClient::AddViewportWidgetContent() 传入一个到该控件的引用(确切地说是 TSharedref<SWidget> ) 来添加到视口中。该函数取入一个控件和Z-排序,Z-排序 向前面所提到的那样决定了新控件的排列顺序。Z-排序是可选的,但是其默认值为 0 。

到您想添加到视口中的控件的引用可以存储为某个类的一个成员,比如您的HUD, 或者可以在调用该函数时创建及传入该控件。

传入一个存储在成员变量中的控件引用(作为 TSharedPtr ):

GEngine->GameViewport->AddViewportWidgetContent(SNew(MyWidgetPtr.ToSharedRef())
);

当将控件传入到 GameViewportClient::AddViewportWidgetContent() 时使用 SNew() 创建该控件:

GEngine->GameViewport->AddViewportWidgetContent(SNew(SWeakWidget).PossiblyNullContent(MyWidgetClass)
); 

或者使用 SAssignNew() 来创建控件,并将它分配给 TSharedPtr 成员,然后传入它:

GEngine->GameViewport->AddViewportWidgetContent(SAssingNew(MyWidgetPtr, SWeakWidget).PossiblyNullContent(MyWidgetClass)
);

从视口中删除控件

通过向 GameViewportClient::RemoveViewportWidgetContent() 中传入到先前添加的控件的引用, 可以从视口中单独地删除Slate控件。

比如:

GEngine->GameViewport->RemoveViewportWidgetContent(SNew(MyWidgetPtr.ToSharedRef())
);

另外,通过调用 GameViewportClient::RemoveAllViewportWidgets() 可以立即删除所有控件。

比如:

GEngine->GameViewport->RemoveAllViewportWidgets();

因为 GEngine 和 GameViewport 都可以为 NULL ,所以在您尝试访问它们或者 其任何成员时,总是应该判断它们的值。

UE4 在游戏中使用Slate相关推荐

  1. Ureal:用ue4做出游戏中的爆炸特效真实感和力量感

    //博主是一个热爱游戏的玩家,并不是专业游戏开发者,内容如有不足,还请各位多多包涵 大家好!今天主要想聊一下:如何体现出游戏中的爆炸特效真实感和力量感 包括Ue4中爆炸的蓝图代码实现的思路(如过需要代 ...

  2. 【UE4】游戏中近战攻击判定检测(一)——射线检测!

    这篇主要分享一下如何在UE4中实现游戏中的近战攻击判定的方法之一--"射线检测",. 首先来说一下实现的逻辑: 1.我们会在武器上设置若干个射线发射点 2.当我们攻击的时候,游戏中 ...

  3. UE4射击游戏中添加瞄准到敌人时准星变红的效果

    主要思路是,建立一个接口Unreal Interface,对需要检测的敌人添加这个接口,当射线检测Result对象继承了该接口时,就让HUD中的准星颜色变红. 首先新建一个Unreal Interfa ...

  4. UE4三维游戏毕设制作与学习过程中的所思所想01

    提示:前面是一大堆可看可不看的"废话". 随着毕设Deadline的越来越近,在前期模型制作上遇到的问题大多都已得到解决,但是在这个过程中却一直没想过写些文字记录下来这个学习的过程 ...

  5. [UE4]网游中角色Pawn的移动位置同步以及RTS多角色同时移动的解决方案

    下面方案的思路是: 每个Actor,为其定义一个代理(ActorProxy),真实的Actor放在服务端,代理ActorProxy放在客户端,移动Actor时,实际是移动服务端上的Actor,然后对客 ...

  6. 游戏中的整容术! 《Honey Select》捏人系统剖析

    关于游戏中的捏人系统,很少有资料提到怎么做,印象中只有<天涯明月刀>分享过.前段时间关注了个VR资源分享的公众号,经常推送HS的捏人作品,所以才引发了我的好奇心,决定一探究竟. HS之所以 ...

  7. matlab中blur函数_游戏中的PostProcessing(后处理)

    PostProcessing是现代游戏中必不可少的技术之一,本文简单来总结下PostProcessing的实现原理和应用.因为详细写起来需要很大篇幅且很费时间,这里只简单介绍下原理. 1.基础部分 P ...

  8. unity 角度限制_喵的Unity游戏开发之路 推球:游戏中的物理

    前言很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本 ...

  9. 游戏中的Decal(贴花)

    在游戏中,decal是一种非常常见的效果,常用来实现弹孔,血迹,涂鸦等效果.最近研究了下Decal在游戏引擎中的实现方式,大致总结了一下: 1.基于面片实现: 直接用一个Quat的mesh,加上一张贴 ...

最新文章

  1. hadoop之 Zookeeper 分布式应用程序协调服务
  2. php操作mysql数据库的扩展有哪些_8.PHP操作MySQL数据库(Mysqli扩展)
  3. asp.net代码审计起始篇之系统搭建
  4. PHP中的static静态变量的使用方法详解
  5. HTML的图片标签image的图片地址
  6. QT信号和槽函数学习笔记
  7. JavaScript call()函数的应用
  8. python api调用 验证码_Python调用创蓝253短信验证码API文档
  9. 图神经网络中的Graph Pooling
  10. 帆软FineMobile 自适应
  11. Report Machine 的问题 补充!!!
  12. [项目源码]ERP进销存系统
  13. 坑人的青旅乐山峨眉两日游
  14. 把sql中的image数据在网页中显示成图片
  15. 如何制作ISO镜像文件
  16. NetLogo的下载安装过程
  17. Xpath爬取豆瓣top250电影
  18. Crafted Item - 合成装备
  19. 湖北武汉施工员报考施工员安全意识的建立方法建筑七大员报考
  20. 【BZOJ】3168: [Heoi2013]钙铁锌硒维生素

热门文章

  1. 主板电源开关接口图解_组装电脑时主板跳线如何接?DIY装机主板接线教程
  2. 计算机系应用,近距离看专业 计算机专业应用篇
  3. jdk1.8 Windows安装全过程详尽版
  4. python高清大图代码_python2的代码从吉卜力网页上下载高清图片
  5. 微型计算机中的80586指,一级B考试模拟试题-套,DOS版本:6.0
  6. 云计算示范项目_上海市经济和信息化委员会关于征集2020年上海市云计算应用示范项目的通知...
  7. android判断是否已经安装成功,android 判断应用程序是否已安装
  8. 五子棋项目结束总结_五子棋编程思想小结
  9. python web生产环境_2020年了,python的web framework sanic 可以考虑生产环境部署了么?...
  10. 高中信息技术考试软件_郑州市高中信息技术学业水平考试23日起网上报名