第 16 天:游戏 UI(UMG)开发,打造主菜单 血条!

news/2025/2/21 16:19:28/

🎯 目标

✅ 使用 UMG 创建 UI 并在游戏中显示
✅ 实现血条(HP Bar)系统,动态显示角色生命值
✅ 创建主菜单 UI,并添加开始/退出按钮
✅ 保存当前场景,创建新场景作为主菜单
✅ 点击 StartGameButton 后,打开原来的游戏场景

1️⃣ 什么是 UMG(Unreal Motion Graphics)?

UMG 是 Unreal Engine 5 内置的 用户界面(UI)框架,可用于:

  • 游戏 HUD(血条、得分)
  • 菜单(主菜单、暂停菜单)
  • 交互界面(对话框、任务面板)

本节实现:

  1. 创建血条 UI,并在 C++ 里动态更新
  2. 保存当前游戏场景
  3. 创建一个新场景作为主菜单
  4. 创建 WBP_MainMenu UI
  5. 点击 StartGameButton 后加载原游戏场景

2️⃣ 创建 HP 血条 UI

🔹 1. 在 UMG 创建血条

  1. 在 Content Browser 里,右键 → User Interface → Widget Blueprint
  2. 命名为 WBP_HealthBar
  3. 双击打开 WBP_HealthBar
  4. 在 Designer 视图中:
    • 添加 Progress Bar(进度条)
    • 命名为 HealthProgressBar
    • 设置 Fill Color 为红色
  5. 保存并关闭
    在这里插入图片描述

✅ 现在 UI 已经准备好,接下来我们用 C++ 绑定血条!

🔹 2. 在 C++ 里绑定 UI

需要在 PlayerCharacter 里:

  1. 创建 UI 并在游戏中显示
  2. 根据角色血量更新 HealthProgressBar

🔹 3. 修改 PlayerCharacter.h

📌 添加 UI 变量

#pragma once#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Blueprint/UserWidget.h"
#include "PlayerCharacter.generated.h"UCLASS()
class MYGAME_API APlayerCharacter : public ACharacter
{GENERATED_BODY()public:APlayerCharacter();protected:virtual void BeginPlay() override;public:// 生命值UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Character Stats")float Health;// 最大生命值UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Character Stats")float MaxHealth;// **存储血条 UI 蓝图的变量**UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI")TSubclassOf<UUserWidget> HealthBarClass;// **实际显示在游戏中的血条 UI**UPROPERTY()UUserWidget* HealthBarWidget;// 更新血条UFUNCTION(BlueprintCallable, Category = "UI")void UpdateHealthBar();
};

✅ 在 蓝图 里设置 HealthBarClass 为 WBP_HealthBar

🔹 4. 修改 PlayerCharacter.cpp

📌 在 BeginPlay() 里创建 UI 并显示

#include "PlayerCharacter.h"
#include "Blueprint/UserWidget.h"
#include "Components/ProgressBar.h"APlayerCharacter::APlayerCharacter()
{Health = 100.0f;MaxHealth = 100.0f;
}void APlayerCharacter::BeginPlay()
{Super::BeginPlay();// **创建 UI 并添加到视口**if (HealthBarClass){HealthBarWidget = CreateWidget<UUserWidget>(GetWorld(), HealthBarClass);if (HealthBarWidget){HealthBarWidget->AddToViewport();UpdateHealthBar();}}
}

📌 更新血条

void APlayerCharacter::UpdateHealthBar()
{if (HealthBarWidget){UProgressBar* HealthBar = Cast<UProgressBar>(HealthBarWidget->GetWidgetFromName(TEXT("HealthProgressBar")));if (HealthBar){HealthBar->SetPercent(Health / MaxHealth);}}
}

✅ 血条 UI 会根据 Health 变化自动更新!

3️⃣ 备份当前场景,并创建新场景

🔹 1. 备份当前游戏场景

  1. 在 Content Browser 里,找到当前关卡(如 GameLevel)
  2. 右键 → Duplicate(复制)
  3. 命名为 GameLevel_Backup
  4. 确保 GameLevel_Backup 仍可正常运行

🔹 2. 创建新的主菜单场景

  1. 在 File → New Level
  2. 选择 Empty Level
  3. 在 World Outliner 里添加
    • Directional Light
    • Sky Sphere
    • Player Start
  4. 保存场景,命名为 MainMenuLevel

✅ 现在有两个场景:

  • GameLevel(游戏主场景)
  • MainMenuLevel(主菜单场景)

4️⃣ 创建主菜单 UI

🔹 1. 在 UMG 创建 WBP_MainMenu

  1. 在 Content Browser 里

    • 右键 → User Interface → Widget Blueprint
    • 命名为 WBP_MainMenu
  2. 双击打开 WBP_MainMenu

  3. 在 Designer 视图中

    • 添加Canvas

    • 添加 Text,设置 Main Menu
      在这里插入图片描述

    • 添加 Button(按钮),命名为 StartGameButton

      • 添加Text,修改文本为退出
        在这里插入图片描述
    • 添加 Button(按钮),命名为 ExitGameButton

      • 添加Text,修改文本为开始
        在这里插入图片描述
        在这里插入图片描述
  4. 保存并关闭

🔹 2. 在蓝图 WBP_MainMenu 绑定按钮事件

  1. 打开 WBP_MainMenu

  2. 选中 StartGameButton

    • 在 Details 里,找到 OnClicked 事件

    • 绑定 On StartGameButton Clicked
      在这里插入图片描述

    • 在蓝图中添加 Open Level 节点,输入 GameLevel
      在这里插入图片描述

  3. 选中 ExitGameButton

    • 绑定 On ExitGameButton Clicked
    • 在蓝图中添加 Quit Game 节点
      📌 最终蓝图逻辑
      在这里插入图片描述

✅ 现在主菜单可以开始游戏 & 退出游戏

5️⃣ 在 GameMode 里加载主菜单 UI

🔹 在 MainMenuLevel 里

  1. 在 Content Browser 里

    • 右键 → Blueprints → GameModeBase
    • 命名为 MyGameMode
  2. 双击打开MyGameMode,添加如下节点
    在这里插入图片描述

  3. 打开 World Settings

  4. 在 GameMode Override 里选择 MyGameMode
    ✅ 现在 MainMenuLevel 运行时,会自动加载 WBP_MainMenu!

6️⃣ 运行测试

  1. 运行 MainMenuLevel
    • StartGameButton → 加载 GameLevel
    • ExitGameButton → 退出游戏
  2. 游戏运行后,显示 GameLevel
    • 血条 & 角色 UI 显示正常
      ✅ 成功实现主菜单 & 场景切换!

🎯 总结

✅ 使用 UMG 创建 血条 UI,并在 C++ 更新血量
✅ 绑定 WBP_HealthBar UI,动态显示角色生命值
✅ 备份 GameLevel,创建 MainMenuLevel 作为主菜单场景
✅ 在 MainMenuLevel 里加载 WBP_MainMenu UI
✅ 主菜单 StartGameButton 点击后加载 GameLevel
✅ ExitGameButton 点击后退出游戏

🎮 现在,你的游戏有了主菜单,并能切换到游戏场景,体验完整的游戏流程!🚀


http://www.ppmy.cn/news/1572796.html

相关文章

循环学习率CLR——Cyclical Learning Rates

目录 一、介绍 二、原理 2.1 如何估算周期长度&#xff1f; 2.2 如何估计合理的最小和最大边界值&#xff1f; 学习率是训练深度神经网络时的重要超参数&#xff0c;本贴介绍了一种设置学习率的方法——循环学习率。它消除了通过实验找到全局学习率最佳值的需要&#xff0c…

IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)

IntelliJ IDEA 接入 AI 编程助手&#xff08;Copilot、DeepSeek、GPT-4o Mini&#xff09; &#x1f4ca; 引言 近年来&#xff0c;AI 编程助手已成为开发者的高效工具&#xff0c;它们可以加速代码编写、优化代码结构&#xff0c;并提供智能提示。本文介绍如何在 IntelliJ I…

Spring Boot “约定大于配置”

什么是“约定大于配置”&#xff1f; “约定大于配置”是一种简化开发的设计理念。简单来说&#xff0c;就是框架默认提供了常见的配置和行为&#xff0c;开发者只需要按照约定来编写代码&#xff0c;避免了繁琐的配置&#xff0c;只在需要时进行定制和调整。这种理念在Spring…

T-Sql 打印所有用户表的建表脚本

-- 声明一个变量用于存储表名 DECLARE TableName NVARCHAR(128); -- 声明一个游标&#xff0c;用于遍历所有用户表 DECLARE TableCursor CURSOR FOR SELECT name FROM sys.tables WHERE type U; -- 打开游标 OPEN TableCursor; -- 从游标中获取第一行数据 FETCH NEXT FROM Ta…

无人机航迹规划: 梦境优化算法(Dream Optimization Algorithm,DOA)求解无人机路径规划MATLAB

一、梦境优化算法 梦境优化算法&#xff08;Dream Optimization Algorithm&#xff0c;DOA&#xff09;是一种新型的元启发式算法&#xff0c;其灵感来源于人类的梦境行为。该算法结合了基础记忆策略、遗忘和补充策略以及梦境共享策略&#xff0c;通过模拟人类梦境中的部分记忆…

【开源免费】基于Vue和SpringBoot的旅游管理系统(附论文)

本文项目编号 T 229 &#xff0c;文末自助获取源码 \color{red}{T229&#xff0c;文末自助获取源码} T229&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

基于Swift实现拼图游戏

写了个拼图游戏&#xff0c;探讨一下相关的 AI 算法。拼图游戏的复原问题也叫做 N 数码问题。 拼图游戏N 数码问题广度优先搜索双向广度优先搜索A*搜索 游戏设定 实现一个拼图游戏&#xff0c;使它具备以下功能&#xff1a; 自由选取喜欢的图片来游戏自由选定空格位置空格邻…

【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…