【虚幻引擎】Runtime下Slate添加到视口

B站教学链接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0
一、C++ 创建PlayerController,HUD、GameMode

在MyGameMode.Cpp中,设置玩家控制器和HUDClass

PlayerControllerClass = AMyPlayerController::StaticClass();
	HUDClass = AMyHUD::StaticClass();

 二、C++创建SlateWidget,它是继承自SComponent的类,命名为MyCompoundWidget

 MyCompoundWidget.h文件

// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "MyHUD.h"
#include "Widgets/SCompoundWidget.h"
/**
 * 
 */
class MYSLATEPROJECT_API SMyCompoundWidget : public SCompoundWidget
{
public:
	SLATE_BEGIN_ARGS(SMyCompoundWidget)
	{}

	SLATE_ARGUMENT(TWeakObjectPtr<AMyHUD>, OWenrHUDArg);
	SLATE_END_ARGS()

	/** Constructs this widget with InArgs */
	void Construct(const FArguments& InArgs);

	FReply OnPlayClicked() const;
	FReply OnQuitClicked() const;


private:
	TWeakObjectPtr<AMyHUD>OwnerHUD;
};

MyCompoundWidget.Cpp文件

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


#include "SMyCompoundWidget.h"
#include "SlateOptMacros.h"
#include "Widgets/Images/Simage.h"
#include "Kismet/KismetSystemLibrary.h"
#include "Kismet/GameplayStatics.h"
#include "Widgets/Layout/SBackgroundBlur.h"
#define LOCTEXT_NAMESPACE "MyNameSpace"

BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SMyCompoundWidget::Construct(const FArguments& InArgs)
{
	OwnerHUD = InArgs._OWenrHUDArg;
	//文本和按钮间距设置
	const FMargin ContentPadding = FMargin(500.0f, 300.0f);
	const FMargin ButtonPadding = FMargin(10.0f);
	//文本和按钮间的距离
	const FText TitleText = LOCTEXT("SlateTest","Just a Slate Test");
	const FText PlayText = LOCTEXT("PlayGame","Play");
	const FText QuitText = LOCTEXT("QuitGame", "QuitGame");
	//按钮字体及大小设置
	FSlateFontInfo ButtonTextStyle = FCoreStyle::Get().GetFontStyle("EmbossedText");
	ButtonTextStyle.Size = 40.0f;
	//标题字体大小设置
	FSlateFontInfo TitleTextStyle = ButtonTextStyle;
	TitleTextStyle.Size = 60.0f;

	
	ChildSlot
		[
		SNew(SOverlay)
		+ SOverlay::Slot()
		.HAlign(HAlign_Fill).VAlign(VAlign_Fill)
		[
			SNew(SImage)
			.ColorAndOpacity(FColor(0,0,0,127))
			//GEngine->GameViewport->GetGameViewportWidget().ToSharedRef()
			//GEngine->GetGameViewportWidget().ToSharedRef()

		]
	    +SOverlay::Slot()
		.HAlign(HAlign_Fill).VAlign(VAlign_Fill)
		[
			SNew(SBackgroundBlur)
			.BlurStrength(10.0f)
		]
		+ SOverlay::Slot()
		.HAlign(HAlign_Fill).VAlign(VAlign_Fill)
		.Padding(ContentPadding)
		[
			SNew(SVerticalBox)
			+SVerticalBox::Slot()
			[
				SNew(STextBlock)
				.Font(TitleTextStyle)
			    .Text(TitleText)
			    .Justification(ETextJustify::Center)
			]
		    +SVerticalBox::Slot()
			.Padding(ButtonPadding)
			[
				SNew(SButton)
				.OnClicked(this,&SMyCompoundWidget::OnPlayClicked)
				[
					SNew(STextBlock)
					.Font(ButtonTextStyle)
				    .Text(PlayText)
				    .Justification(ETextJustify::Center)
				]
			]
			+ SVerticalBox::Slot()
			.Padding(ButtonPadding)
			[
				SNew(SButton)
				.OnClicked(this, &SMyCompoundWidget::OnQuitClicked)
			  [
				SNew(STextBlock)
				.Font(ButtonTextStyle)
				.Text(QuitText)
				.Justification(ETextJustify::Center)
			  ]
			]
		]
	];
	
}
FReply SMyCompoundWidget::OnPlayClicked() const
{
	if (OwnerHUD.IsValid())
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("Play"));
		OwnerHUD->RemoveMySlate();
	}
	return FReply::Handled();
}
FReply SMyCompoundWidget::OnQuitClicked() const
{
	if (OwnerHUD.IsValid())
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("Quit"));
		OwnerHUD->PlayerOwner->ConsoleCommand("quit");

	}
	return FReply::Handled();
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION

#undef LOCTEXT_NAMESPACE

三、添加Slate到视口中

在MyHUD.h中

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

#pragma once


#include "CoreMinimal.h"
#include "Widgets/SWeakWidget.h"
#include "GameFramework/HUD.h"

#include "MyHUD.generated.h"


class SMyCompoundWidget;
/**
 * 
 */
UCLASS()
class MYSLATEPROJECT_API AMyHUD : public AHUD
{
	GENERATED_BODY()
public:
	void ShowMySlate();
	void RemoveMySlate();

	virtual void BeginPlay() override;
private:
	TSharedPtr<SMyCompoundWidget> MyCompoundWidget;

	TSharedPtr<SWidget> WidgetContainer;
	
};

MyHUD.Cpp中

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


#include "MyHUD.h"
#include "SMyCompoundWidget.h"
#include "MyEditor.h"
#include "Kismet/GameplayStatics.h"


void AMyHUD::ShowMySlate()
{
	if (GEngine && GEngine->GameViewport)
	{
		//第一种添加窗口方式
		MyCompoundWidget = SNew(SMyCompoundWidget).OWenrHUDArg(this);
		GEngine->GameViewport->AddViewportWidgetContent(MyCompoundWidget.ToSharedRef());
		//第二种添加窗口方式
		//GEngine->GameViewport->AddViewportWidgetContent(SAssignNew(WidgetContainer, SWeakWidget).PossiblyNullContent(MyCompoundWidget.ToSharedRef()));
	}
	
}

void AMyHUD::RemoveMySlate()
{
	if (GEngine && GEngine->GameViewport && MyCompoundWidget)
	{
		//第一种移除窗口方式
		GEngine->GameViewport->RemoveViewportWidgetContent(MyCompoundWidget.ToSharedRef());

		//第二种移除窗口方式
		//GEngine->GameViewport->RemoveViewportWidgetContent(WidgetContainer.ToSharedRef());
	}
}

void AMyHUD::BeginPlay()
{
	Super::BeginPlay();
	ShowMySlate();
	
}

四、设置世界设置GameMode

运行结果为: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

飞起的猪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值