《UE5_C++多人TPS完整教程》学习笔记16 ——《P17 菜单类(The Menu Class)》

2024-02-15 19:44

本文主要是介绍《UE5_C++多人TPS完整教程》学习笔记16 ——《P17 菜单类(The Menu Class)》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P17 菜单类(The Menu Class)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。


文章目录

  • P17 菜单类
  • 17.1 创建菜单类
  • 17.2 创建菜单控件
  • 17.3 Summary


P17 菜单类

本节课我们将创建一个菜单类,并设置它作为(用户界面)控件蓝图(Widget blueprint)的父类;我们还将在菜单中添加点击后可以 “创建(游戏会话)” 和 “加入(游戏会话)” 的按钮。
在这里插入图片描述


17.1 创建菜单类

  1. 我们可以在具体的游戏项目中制作菜单,也可以在我们创建的多人会话插件中制作,这样做的好处在于我们将插件移植到另一个游戏项目时,菜单就已经构建好了,不需要重新构建,只需要根据另一个游戏项目来配置一些设置(例如最大连接数、匹配类型等)即可

  2. 在虚幻引擎内容浏览器中展开目录 “Plugins/MultiplayerSessionsC++类/MultiplayerSessions/Public”,添加一个新的用户控件 “UserWidget” C++ 类。
    在这里插入图片描述

  3. 将新添加的用户控件 C++ 类命名为 “Menu”,选择模块为插件 “MultiplayerSessions (Runtime)”。
    在这里插入图片描述

  4. 点击“创建类”,VS 中出现弹窗,选择 “全部重新加载”。
    在这里插入图片描述

  5. 添加模块 “UMG”、“Slate”、“SlateCore” 到构建文件 “MultiplayerSessions.Build.cs” 的公共依赖项中,然后生成解决方案,这样我们在访问与 “UMG” 相关的模块时,就可以避免编译错误。
    在这里插入图片描述

  6. 在 “Menu.h” 中定义构造函数 “MenuSetup()”。

    // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
    #include "Blueprint/UserWidget.h"
    #include "Menu.generated.h"/*** */
    UCLASS()
    class MULTIPLAYERSESSIONS_API UMenu : public UUserWidget
    {GENERATED_BODY()
    /* P17 菜单类(The Menu Class)*/
    public:UFUNCTION(BlueprintCallable)void MenuSetup();
    /* P17 菜单类(The Menu Class)*/
    };
    
  7. 在 “Menu.cpp” 中完善构造函数 “MenuSetup()” 定义,然后进行编译。

    // Fill out your copyright notice in the Description page of Project Settings.#include "Menu.h"/* P17 菜单类(The Menu Class)*/
    void UMenu::MenuSetup()
    {AddToViewport();							// 添加到视口SetVisibility(ESlateVisibility::Visible);	// 设置菜单可见bIsFocusable = true; 						// 允许鼠标点击的时候聚焦UWorld* World = GetWorld();if (World){APlayerController* PlayerController = World->GetFirstPlayerController();	// 获取玩家控制器指针if (PlayerController){FInputModeUIOnly InputModeSettings;	// 用于设置只允许控制 UI 的输入模式// 输入模式设置InputModeSettings.SetWidgetToFocus(TakeWidget());	// 设置焦距,TakeWidget()将获取底层的 slate 部件,如果不存在则构造它InputModeSettings.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);	//设置鼠标在视口时不锁定// 将设置好的输入模式传送到到玩家控制器的输入模式PlayerController->SetInputMode(InputModeSettings);	// 设置玩家控制器的输入模式PlayerController->SetShowMouseCursor(true);			// 显示鼠标光标}}
    }
    /* P17 菜单类(The Menu Class)*/
    

17.2 创建菜单控件

  1. 在虚幻引擎内容浏览器中展开目录 “Plugins/MultiplayerSessions内容”,选择添加一个控件蓝图“WidgetBlueprint” 类,在 “选中新控件蓝图的根控件” 窗口中选择 “Menu”,然后将新生成的控件蓝图命名为 “WBP_Menu”。
    在这里插入图片描述
    在这里插入图片描述

  2. 双击 “WBP_Menu” 图标,进入用户控件设计器窗口。与教学视频中 “WBP_Menu” 自带 “画布画板”(Canavs Panel)不同,我们需要手动添加,在左侧 “控制板” 面板展开 “面板” 选项卡,将 “画布画板”拖拽到设计器当中,然后拖拽 “画布画板” 右下角双向箭头调整分辨率为 “1920 × 1080”。
    在这里插入图片描述

  3. 确定在左下 “层级” 面板中已经选中 “画布画板” 后,在 “控制板” 面板中将 “通用” 选项卡下的 “按钮”(Button)组件拖拽到设计器中,添加两个按钮 “HostButton” 和 “JoinButton”;接着在右侧 “细节” 面板中设置 “瞄点” (Anchors)在 “画布画板” 的中下方;然后设置 “HostButton” 的 “位置 X” 为 -650、“位置 Y” 为 -300、“尺寸 X” 为 350、“尺寸 Y” 为 100,设置 “JoinButton” 的 “位置 X” 为 -250、“位置 Y” 为 -300、“尺寸 X” 为 350、“尺寸 Y” 为 100。
    在这里插入图片描述

  4. 为按钮添加文字。在 “控制板” 面板中将 “通用” 中的 “文本”(Text)组件拖拽到 “HostButton" 上,在右侧 “细节” 面板中可以设置文本内容和字体样式。对 “JoinButton" 重复相同的工作,编译、保存。
    在这里插入图片描述

  5. 测试控件是否可用。转到 “ThirdPersonMap” 面板,在工具栏上点击 “蓝图”,然后在弹出的下拉菜单选中 “打开关卡蓝图”。
    在这里插入图片描述
    在关卡蓝图编辑器中绘制以下蓝图。
    在这里插入图片描述

  6. 使用 PIE 模式进行测试,可以看到我们创建的控件显示在视口当中。
    在这里插入图片描述


17.3 Summary

本节课首先在虚幻引擎中以用户控件 “UserWidget” C++ 类为父类,新建了 “Menu” 菜单类;此后我们在 VS 创建了 “Menu” 的构造函数 “MenuSetup()”,并完善其定义;接着我们添加一个以 “Menu” 为父类的控件蓝图“WidgetBlueprint” 类 “WBP_Menu”,并使用虚幻引擎用户控件设计器设计样式;最后我们为关卡 “ThirdPersonMap” 绘制蓝图以启用控件 “WBP_Menu”,测试了该控件的可用性。
在这里插入图片描述

17.1 创建用户控件类步骤 5 中,在访问与 “UMG” 相关的模块前,需要先添加模块 “UMG”、“Slate”、“SlateCore” 到构建文件 “MultiplayerSessions.Build.cs” 的公共依赖项中,这样可以避免编译错误。

17.2 创建菜单控件步骤 2 中,我们需要手动添加“画布画板”(Canavs Panel),在左侧 “控制板” 面板展开 “面板” 选项卡,将 “画布画板” 拖拽到设计器当中即可添加。


这篇关于《UE5_C++多人TPS完整教程》学习笔记16 ——《P17 菜单类(The Menu Class)》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712353

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数