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
运行结果为: