UE4 通过按键切换不同的HUD
创始人
2024-02-19 09:24:48
0

咱们在玩游戏的时候,通常会和界面进行各种各样的互动,而且会动都是在不同的界面上,所以需要在不同的界面上进行切换或者多个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 mainHUDAsset;//创建后用于空间变量UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")UUserWidget* mainHUDMenu;//编辑器内UMG资产的引用UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "AAA")TSubclassOf 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(this, mainHUDAsset);}if (subHUDAsset) {subHUDMenu = CreateWidget(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 propertiesASpawnActor();protected:// Called when the game starts or when spawnedvirtual void BeginPlay() override;public:// Called every framevirtual void Tick(float DeltaTime) override;public:UPROPERTY(EditAnywhere, Category = "AAA")TSubclassOf 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(subFloatingActor, spawnLocation, spwanRotation, spawnParam);}
}

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...