《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

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插