本文为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 创建菜单类
-
我们可以在具体的游戏项目中制作菜单,也可以在我们创建的多人会话插件中制作,这样做的好处在于我们将插件移植到另一个游戏项目时,菜单就已经构建好了,不需要重新构建,只需要根据另一个游戏项目来配置一些设置(例如最大连接数、匹配类型等)即可。
-
在虚幻引擎内容浏览器中展开目录 “
Plugins/MultiplayerSessionsC++类/MultiplayerSessions/Public
”,添加一个新的用户控件 “UserWidget
” C++ 类。
-
将新添加的用户控件 C++ 类命名为 “
Menu
”,选择模块为插件 “MultiplayerSessions (Runtime)
”。
-
点击“创建类”,VS 中出现弹窗,选择 “全部重新加载”。
-
添加模块 “
UMG
”、“Slate
”、“SlateCore
” 到构建文件 “MultiplayerSessions.Build.cs
” 的公共依赖项中,然后生成解决方案,这样我们在访问与 “UMG
” 相关的模块时,就可以避免编译错误。
-
在 “
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)*/ };
-
在 “
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 创建菜单控件
-
在虚幻引擎内容浏览器中展开目录 “
Plugins/MultiplayerSessions内容
”,选择添加一个控件蓝图“WidgetBlueprint
” 类,在 “选中新控件蓝图的根控件” 窗口中选择 “Menu
”,然后将新生成的控件蓝图命名为 “WBP_Menu
”。
-
双击 “
WBP_Menu
” 图标,进入用户控件设计器窗口。与教学视频中 “WBP_Menu
” 自带 “画布画板”(Canavs Panel)不同,我们需要手动添加,在左侧 “控制板” 面板展开 “面板” 选项卡,将 “画布画板”拖拽到设计器当中,然后拖拽 “画布画板” 右下角双向箭头调整分辨率为 “1920 × 1080”。
-
确定在左下 “层级” 面板中已经选中 “画布画板” 后,在 “控制板” 面板中将 “通用” 选项卡下的 “按钮”(Button)组件拖拽到设计器中,添加两个按钮 “
HostButton
” 和 “JoinButton
”;接着在右侧 “细节” 面板中设置 “瞄点” (Anchors)在 “画布画板” 的中下方;然后设置 “HostButton
” 的 “位置 X” 为 -650、“位置 Y” 为 -300、“尺寸 X” 为 350、“尺寸 Y” 为 100,设置 “JoinButton
” 的 “位置 X” 为 -250、“位置 Y” 为 -300、“尺寸 X” 为 350、“尺寸 Y” 为 100。
-
为按钮添加文字。在 “控制板” 面板中将 “通用” 中的 “文本”(Text)组件拖拽到 “
HostButton
" 上,在右侧 “细节” 面板中可以设置文本内容和字体样式。对 “JoinButton
" 重复相同的工作,编译、保存。
-
测试控件是否可用。转到 “
ThirdPersonMap
” 面板,在工具栏上点击 “蓝图”,然后在弹出的下拉菜单选中 “打开关卡蓝图”。
在关卡蓝图编辑器中绘制以下蓝图。
-
使用 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),在左侧 “控制板” 面板展开 “面板” 选项卡,将 “画布画板” 拖拽到设计器当中即可添加。