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

news2024/11/26 0:56:46

本文为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),在左侧 “控制板” 面板展开 “面板” 选项卡,将 “画布画板” 拖拽到设计器当中即可添加。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1449266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装Centos系统

1.镜像安装 镜像安装:Centos7安装 2.安装过程(直接以图的形式呈现) 选择你已经下载好的镜像 回车即可,等待安装 等待安装即可

MOS管开关电路实例、功耗计算

一、mos管的工作区域 mos管有三个工作区域&#xff1a; 截止区域 线性&#xff08;欧姆&#xff09;区域 饱和区域 当 VGS < VTH时&#xff0c;mos管工作在截止区域。在该区域中&#xff0c;mos管处于关断状态&#xff0c;因为在漏极和源极之间没有感应沟道。 对于要感…

【Linux】环境变量及相关指令

一、环境变量的基本概念 其实&#xff0c;我们早就听说过环境变量&#xff0c;比如在学习 JAVA / Python 的时候&#xff0c;会在 Windows 上配置环境变量&#xff1a; 环境变量到底是什么呢&#xff1f; 环境变量&#xff08;environment variables&#xff09;一般是指在操作…

第四篇:SQL语法-DDL-数据定义语言

大年初一限定篇&#x1f600; &#xff08;祝广大IT学习者、工作者0 error 0 warning&#xff01;&#xff09; DDL英文全称是Data Definition Language&#xff08;数据定义语言&#xff09;&#xff0c;用来定义关系模式、删除关系、修改关系模式以及创建数据库中的各种对象 …

毕业设计vue+php幼儿园网站系统yl567

幼儿园网站系统。采用vscode集成IDE对幼儿园网站系统统进行开发,整合系统的各个模块。 拟开发的幼儿园网站系统通过测试,确保在最大负载的情况下稳定运转,各个模块工作正常,具有较高的可用性。系统整体界面简洁美观,用户使用简单,满足用户需要。在因特网发展迅猛的当今社会,幼儿…

Spring Boot 笔记 021 项目部署

1.1 引入坐标&#xff0c;并双击package打包成jar包 1.2 在服务器上运行jar包 1.3 使用postman测试 2.1 运行配置 2.1.1 命令更改端口 java -jar big-event-1.0-SNAPSHOT.jar --server.port7777 2.1.2 环境变量更新&#xff08;略&#xff09; 2.1.3 外部配置文件&#xff0c…

Excel练习:日历

Excel练习&#xff1a;日历 ‍ 题目&#xff1a;制作日历 ‍ ​​ 用rows和columns函数计算日期单元格偏移量 一个公式填充所有日期单元格 ​​ ‍

爬爬爬——qq模拟登录,古诗文网模拟登录并爬取内容(cookie)

cookie——可以理解为&#xff0c;记录为登录状态。如果在登录一个网站之后&#xff0c;想拿到信息发现404了&#xff0c;就是没有加cookie在这个header里。 下图加了cookie和没有加的对比&#xff08;我是用了selenuim自动化登录的&#xff09;&#xff1a; 下面是加了的 这个…

数据分析案例-基于亚马逊智能产品评论的探索性数据分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

FreeRTOS 调度算法简述

优先级抢占式调度 本章的示例程序已经演示了 FreeRTOS 在什么时候以及以什么方式选择一个什么 样的任务来执行。  每个任务都赋予了一个优先级。  每个任务都可以存在于一个或多个状态。  在任何时候都只有一个任务可以处于运行状态。  调度器总是在所有处于就…

华为23年9月笔试原题,巨详细题解,附有LeetCode测试链接

文章目录 前言思路主要思路关于f函数的剖析Code就到这&#xff0c;铁子们下期见&#xff01;&#xff01;&#xff01;&#xff01; 前言 铁子们好啊&#xff01;今天阿辉又给大家来更新新一道好题&#xff0c;下面链接是23年9月27的华为笔试原题&#xff0c;LeetCode上面的ha…

VueCLI核心知识3:全局事件总线、消息订阅与发布

这两种方式都可以实现任意两个组件之间的通信 1 全局事件总线 1.安装全局事件总线 import Vue from vue import App from ./App.vueVue.config.productionTip false/* 1.第一种写法 */ // const Demo Vue.extend({}) // const d new Demo()// Vue.prototype.x d // 把Dem…

Python算法探索:从经典到现代(三)

一、引言 随着信息技术的飞速发展&#xff0c;数据已经成为现代社会不可或缺的资源。Python&#xff0c;作为数据处理和分析的利器&#xff0c;为我们提供了大量强大的库和工具&#xff0c;用于从经典到现代的各种算法探索。本文将带你领略Python在算法领域的魅力&#xff0c;从…

OJ刷题:猜名次和找凶手【建议收藏点赞】

目录 1. 猜名次2. 找凶手 1. 猜名次 代码实现&#xff1a; #include <stdio.h>int main() {int a 0;int b 0;int c 0;int d 0;int e 0;for (a 1; a < 5; a){for (b 1; b < 5; b){for (c 1; c < 5; c){for (d 1; d < 5; d){for (e 1; e < 5; e)…

Windows 版Oracle 数据库(安装)详细过程

首先到官网上去下载oracle64位的安装程序 第一步&#xff1a;将两个datebase文件夹解压到同一目录中。 当下载完成后,它里面是两个文件夹 win64_11gR2_database_1of2, win64_11gR2_database_2of2,我们需要把其中的一个database文件夹整合在一起(复制一个database文件夹到另一…

寒假作业:2024/2/14

作业1&#xff1a;编程实现二维数组的杨辉三角 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {int n;printf("please enter n:");scanf("%d",&n);int a…

Nvm安装(windows版)

1、nvm 是什么 &#xff08;1&#xff09;nvm(Node.js version manager) 是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 &#xff08;2&#xff09;有时候&#xff0c;我们可能同时在进行多个项目开发&#xff0c;而多个项…

Netty Review - 服务端channel注册流程源码解析

文章目录 PreNetty主从Reactor线程模型服务端channel注册流程源码解读入口 serverBootstrap.bind(port)执行队列中的任务 &#xff1a; AbstractUnsafe#register0注册 doRegister() 源码流程图 Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketCh…

深入探索Pandas读写XML文件的完整指南与实战read_xml、to_xml【第79篇—读写XML文件】

深入探索Pandas读写XML文件的完整指南与实战read_xml、to_xml XML&#xff08;eXtensible Markup Language&#xff09;是一种常见的数据交换格式&#xff0c;广泛应用于各种应用程序和领域。在数据处理中&#xff0c;Pandas是一个强大的工具&#xff0c;它提供了read_xml和to…

MySQL-----函数篇

目录 ▶ 字符串函数 ▶ 数值函数 ▶ 日期函数 ▶ 流程函数 ▶ 简介 函数是指一段可以直接被另一段程序调用的程序或代码。 ▶ 字符串函数 函数描述实例ASCII(s)返回字符串 s 的第一个字符的 ASCII 码。 返回 CustomerName 字段第一个字母的 ASCII 码&#xff1a; S…