UE4 通过按键切换不同的HUD

该博客介绍了在游戏开发中如何实现玩家控制器类(PlayerController)对多个 Heads-Up Display(HUD)的管理,包括创建和切换不同HUD,以及通过接口类和管理类进行交互。通过示例代码展示了如何在角色类中响应按键事件,动态改变游戏界面的显示。
摘要由CSDN通过智能技术生成

咱们在玩游戏的时候,通常会和界面进行各种各样的互动,而且会动都是在不同的界面上,所以需要在不同的界面上进行切换或者多个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值