UE4 通过按键切换不同的HUD

news2025/2/25 6:27:55

咱们在玩游戏的时候,通常会和界面进行各种各样的互动,而且会动都是在不同的界面上,所以需要在不同的界面上进行切换或者多个HUD重叠显示在一起。
首先创建两个HUD
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.重新定义一个PlayerController类
在这里插入图片描述

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "ChangeHUD/IChangeHUD.h"
#include "CameraPlayerController.generated.h"

/**
 *
 */
UCLASS()
class TRUEFPSPROJECT_API ACameraPlayerController 
	: public APlayerController
	, public IChangeHUD {
	GENERATED_BODY()

public:
	ACameraPlayerController();

	//编辑器内UMG资产的引用
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")
	TSubclassOf<class UUserWidget> mainHUDAsset;

	//创建后用于空间变量
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")
	UUserWidget* mainHUDMenu;
	
	//编辑器内UMG资产的引用
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")
	TSubclassOf<class UUserWidget> subHUDAsset;

	//创建后用于空间变量
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")
	UUserWidget* subHUDMenu;

	virtual void BeginPlay();

	virtual void changeHUD()override;
private:
	int32 HUDChoose = 0;//切换不同的HUD界面
	UUserWidget* _currentHUD = nullptr;
};

// Fill out your copyright notice in the Description page of Project Settings.


#include "CameraPlayerController.h"
#include "Blueprint/UserWidget.h"
#include "ChangeHUD/ChangeHUDManager.h"

ACameraPlayerController::ACameraPlayerController() {
	ChangeHUDMgr()->changeHUDInterface = this;
}

void ACameraPlayerController::BeginPlay() {
	Super::BeginPlay();
	if (mainHUDAsset) {
		mainHUDMenu = CreateWidget<UUserWidget>(this, mainHUDAsset);
	}

	if (subHUDAsset) {
		subHUDMenu = CreateWidget<UUserWidget>(this, subHUDAsset);
	}
}

void ACameraPlayerController::changeHUD() {
	if (_currentHUD) {
		_currentHUD->RemoveFromViewport();
	}
	HUDChoose += 1;
	if (HUDChoose%3 == 0){
		_currentHUD = mainHUDMenu;
		_currentHUD->AddToViewport();

	} else if(HUDChoose % 3 == 1) {
		_currentHUD = subHUDMenu;
		_currentHUD->AddToViewport();

	}else{
		mainHUDMenu->AddToViewport();
		subHUDMenu->AddToViewport();
	}

}

定义一个接口类和接口管理类

#pragma once
class IChangeHUD {

public:
	virtual void changeHUD() = 0;
};
#pragma once

#define ChangeHUDMgr() (ChangeHUDManager::getInstance())

class ChangeHUDManager {
private:
	ChangeHUDManager();
	static ChangeHUDManager* _instance;
public:
	static ChangeHUDManager* getInstance();

	class IChangeHUD* changeHUDInterface;
};


#include "ChangeHUDManager.h"
#include "IChangeHUD.h"

ChangeHUDManager* ChangeHUDManager::_instance = new ChangeHUDManager;

ChangeHUDManager::ChangeHUDManager() {

}

ChangeHUDManager* ChangeHUDManager::getInstance() {
	return _instance;
}

在角色类中通过按键H来调用:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SpawnActor.generated.h"

UCLASS()
class TRUEFPSPROJECT_API ASpawnActor : public AActor {
	GENERATED_BODY()

public:
	// Sets default values for this actor's properties
	ASpawnActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:
	// Called every frame
	virtual void Tick(float DeltaTime) override;

public:
	UPROPERTY(EditAnywhere, Category = "AAA")
	TSubclassOf<class AFloatingActor> subFloatingActor;

	float baseTime = 0.0;
};

// Fill out your copyright notice in the Description page of Project Settings.


#include "SpawnActor.h"
#include "FloatingActor.h"

// Sets default values
ASpawnActor::ASpawnActor() {
	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void ASpawnActor::BeginPlay() {
	Super::BeginPlay();

}

// Called every frame
void ASpawnActor::Tick(float DeltaTime) {
	Super::Tick(DeltaTime);

	if ((baseTime += DeltaTime) <= 3.0){
		return;
	}

	baseTime = 0.0;

	UWorld* world = GetWorld();
	if (world){
		FVector spawnLocation = GetActorLocation();
		FRotator spwanRotation = GetActorRotation();

		FActorSpawnParameters spawnParam;
		spawnParam.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding;

		world->SpawnActor<AFloatingActor>(subFloatingActor, spawnLocation, spwanRotation, spawnParam);
	}
}

点击【运行】
在这里插入图片描述
aaa

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

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

相关文章

被裁后半月面试8家公司无果,凭借这份Java面试指南成功入职阿里

前言 上个月班上的好好的突然被通知"毕业了"&#xff0c;现在工作也确实不好找。之前近一个月面了很多大大小小的公司降薪太严重都没考虑去&#xff0c;最后没办法本来都打算随便去一家了却偶然得到一个阿里的面试机会&#xff0c;足足面了七面&#xff08;我太难了…

前有刘德华,后有腾格尔和光头李进,明星为何都热衷于线上演唱会

2022年11月19日&#xff0c;有着“草原歌神”之称的腾格尔&#xff0c;开启了自己的线上演唱会&#xff0c;并且取得了圆满的成功。其实在此之前&#xff0c;天王刘德华已经在某音平台&#xff0c;两次开启自己的线上演唱会&#xff0c;都受到了非常好的效果。 为什么音乐领域的…

手把手教你定位线上MySQL锁超时问题,包教包会

昨晚我正在床上睡得着着的&#xff0c;突然来了一条短信。 ​什么&#xff1f;线上的订单无法取消&#xff01; 我赶紧登录线上系统&#xff0c;查看业务日志。 ​发现有MySQL锁超时的错误日志。 不用想&#xff0c;肯定有另一个事务正在修改这条订单&#xff0c;持有这条订单的…

【边缘注意:深度多尺度特征】

Learning a Deep Multi-Scale Feature Ensemble and an Edge-Attention Guidance for Image Fusion &#xff08;学习深度多尺度特征集成和图像融合的边缘注意指南&#xff09; 在本文中&#xff0c;我们提出了一种用于红外和可见光图像融合的深度网络&#xff0c;该网络将具…

带你了解什么是Java虚拟机运行时数据区

一、前言 程序都是运行在内存里的&#xff0c;所以对于一门开发语言来说&#xff0c;对于内存的管理都是重中之重的&#xff0c;前有C、C需要开发者管理内存&#xff0c;后有Java的自动内存管理&#xff0c;到如今的内存安全的Rust。 二、运行时数据区概览 Java虚拟机在运行…

PyQt5可视化编程-菜单和工具栏

一、简介 PyQt5 是Digia的一套Qt5与python绑定的应用框架&#xff0c;同时支持2.x和3.x。本教程使用的是3.x。Qt库由Riverbank Computing开发&#xff0c; 是最强大的GUI库之一 &#xff0c;官方网站&#xff1a;www.riverbankcomputing.co.uk/news。 PyQt5是由一系列Python模块…

Allegro上如何让飞线以方框形式显示

Allegro上如何让飞线以方框形式显示 Allegro可以让飞线以方框形式显示,让走线评估更简单,尤其是电源和地,如下图 选择Edit-Property Find选择Nets 选择需要改成方框显示的网络,左边选择Voltage,Value里面输入任意一个数字,比如0或者1,apply 可以看到网络已经显示成…

八.调试的技巧

目录 一.调试 1.何为调试&#xff1f; 2.调试的基本步骤 二.debug和release的介绍 三.Windows环境调试介绍 1.调试环境准备 2.学会快捷键 &#xff08;1&#xff09;F5 &#xff08;2&#xff09;F9 &#xff08;3&#xff09;F10 &#xff08;4&#xff09;F11 &am…

【Java学习】JavaWeb ---- JDBC

文章目录JDBC 快速入门ResultSet数据连接池JDBC 快速入门 下载jar包&#xff08;百度&#xff09;->add as library 代码 package com.ith.jdbc;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class demo1 {public stati…

HTTPS一定安全吗

https是一种通过计算机网络进行安全通信的传输协议&#xff0c;主要目的是提供对网站服务器的身份认证&#xff0c;保护交换数据的隐私与完整性&#xff0c;但不能说使用htttps就一定绝对的安全。 有一点需要了解的是&#xff0c;使用HTTPS 在内容传输的加密上使用的是对称加密…

使用dreamweaver制作采用DIV+CSS进行布局——美食甜品店铺加盟企业HTML静态网页 ——学生美食网页设计作品静态HTML网页模板源码

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

C++标准库分析总结(九)——<适配器>

目录 1 适配器简介 2 适配器使用分类 2.1 容器适配器 2.2 函数适配器 2.2.1 常见的函数适配器 2.2.2 bind2nd 2.2.3 not1 2.2.4 bind用法 2.3 迭代器适配器 2.4 X适配器 1.6.1 ostream_iterator 1.6.2 istream_iterator 1 适配器简介 把一个原本存在的东西&#xf…

递归和排序算法的应用

一、递归常见问题和注意事项 1. 堆栈溢出&#xff1b; 2. 警惕重复运算&#xff1a; 可以使用一个数据结构&#xff08;散列表&#xff09;将已经计算过的f(k)保存起来&#xff0c;每当调用到f(k)时&#xff0c;先产看下是否已经求结果&#xff0c;从而避免重复计算。 3. 将递…

【嵌入式Linux】5.Ubuntu 交叉编译工具链安装

前言 交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。 其基本特点是: 1、它肯定是一个 GCC 编译器。 2、这个 GCC 编译器是运行在 X86 架构的 PC 上的。 3、这个 GCC 编译器是编译 ARM 架构代码的,也就是编译出来的可…

MongoDB 的安装、启动与连接

MongoDB 的安装、启动与连接一、MongoDB Community Server1. 安装(1) 下载(2) 安装1) 解压2) 配置环境变量3) 配置数据库存放目录a. 创建b. 赋权2. 启动验证二、MongoDB Compass安装三、连接一、MongoDB Community Server 1. 安装 (1) 下载 官网下载安装 (2) 安装 1) 解压…

three.js之访问几何体数据与几何体的旋转平移

文章目录访问几何体数据简介例子BoxGeometryPlaneBufferGeometry旋转、缩放、平移变换注意专栏目录请点击 访问几何体数据 简介 一般我们在开发项目的时候&#xff0c;可能会加载外部模型&#xff0c;这个时候&#xff0c;我们就需要获取到几何体的顶点数据这个时候&#xff…

Kubernetes入门

文章目录1、K8s快速入门1&#xff09;简介2&#xff09;架构&#xff08;1&#xff09;整体主从方式&#xff08;2&#xff09;master节点架构&#xff08;3&#xff09;Node节点架构3&#xff09;概念4&#xff09;快速体验&#xff08;1&#xff09;安装minikube&#xff08;…

商城项目环境准备 — docker安装elasticsearch

文章目录一、操作系统虚拟内存设置为262144二、拉取elasticsearch镜像三、创建docker容器挂载的目录四、设置挂载文件访问权限五、启动elasticsearch六、访问一、操作系统虚拟内存设置为262144 原因&#xff1a;系统虚拟内存默认最大映射数为65530&#xff0c;无法满足ES系统要…

十万部冷知识:“梅西”是怎么炼成的

随着2022卡塔尔世界杯小组赛第二轮的打响&#xff0c;现在第一支确定被淘汰的队伍已经出现了&#xff0c;它就是东道主卡塔尔队。它也成了继南非世界杯以来&#xff0c;史上第二个小组赛出局的东道主。而在明天的凌晨3点C组的比赛中&#xff0c;广大球迷朋友们关注的阿根廷队也…

C/C++指针入门详解(一)

一、引言 指针是一个地址&#xff0c;这个地址不仅可以是变量的地址&#xff0c;也可以是其它数据结构的地址。为了方便调用这个地址&#xff0c;C/C是通过指针变量来使用这个地址的。而我们常说的指针&#xff0c;其实在一定程度上说的是指针变量&#xff0c;但是我们必须清楚…