七、Debug与游戏设置控件
Debug
SlAiHelper.h
#pragma once
#include"CoreMinimal.h"
#include"Engine/World.h"
#include"Engine/GameEngine.h"
namespace SlAiHelper {
//Debug
FORCEINLINE void Debug(FString Message, float Duration = 100.f) {
if (GEngine) {
GEngine->AddOnScreenDebugMessage(-1, Duration, FColor::Yellow, Message);
}
}
}
通过CheckBox实现切换中英文
设置样式
/*
* GameSet的背景
*/
UPROPERTY(EditAnywhere, Category = GameOption)
FSlateBrush GameOptionBGBrush;
/*
* CheckBox的Brush被选中
*/
UPROPERTY(EditAnywhere, Category = GameOption)
FSlateBrush CheckedBoxBrush;
/*
* CheckBox的Brush不被选中
*/
UPROPERTY(EditAnywhere, Category = GameOption)
FSlateBrush UnCheckedBoxBrush;
数据类型
UENUM()
enum class ECultureTeam : uint8 {
EN = 0,
ZH
};
声明
SlAiGameOptionWidget.h
#pragma once
#include "CoreMinimal.h"
#include "Widgets/SCompoundWidget.h"
/**
*
*/
class SLAICOURSE_API SSlAiGameOptionWidget : public SCompoundWidget
{
public:
SLATE_BEGIN_ARGS(SSlAiGameOptionWidget)
{
}
SLATE_END_ARGS()
/** Constructs this widget with InArgs */
void Construct(const FArguments& InArgs);
private:
//统一设置样式
void StyleInitialize();
//中文CheckBox事件
void ZhCheckBoxStateChanged(ECheckBoxState NewState);
//英文CheckBox事件
void EnCheckBoxStateChanged(ECheckBoxState NewState);
private:
//获取CheckBox指针
TSharedPtr<class SCheckBox> EnCheckBox;
TSharedPtr<SCheckBox> ZhCheckBox;
};
数据处理
SlAiDataHandle.h
#pragma once
#include "CoreMinimal.h"
#include"SlAiTypes.h"
/**
*
*/
class SLAICOURSE_API SlAiDataHandle
{
public:
SlAiDataHandle();
static void Initialize();
static TSharedPtr<SlAiDataHandle> Get();
//修改中英文
void ChangeLocalzationCulture(ECultureTeam Culture);
public:
//当前语言
ECultureTeam CurrentCulture;
private:
//创建单例
static TSharedRef<SlAiDataHandle> Create();
private:
static TSharedPtr<SlAiDataHandle> DataInstance;
};
SlAiDataHandle.cpp
#include "SlAiDataHandle.h"
#include"Internationalization.h"
TSharedPtr<SlAiDataHandle> SlAiDataHandle::DataInstance = nullptr;
void SlAiDataHandle::Initialize()
{
if (!DataInstance.IsValid())
DataInstance = Create();
}
TSharedPtr<SlAiDataHandle> SlAiDataHandle::Get()
{
Initialize();
return DataInstance;
}
TSharedRef<SlAiDataHandle> SlAiDataHandle::Create()
{
TSharedRef<SlAiDataHandle> DataRef = MakeShareable(new SlAiDataHandle());
return DataRef;
}
SlAiDataHandle::SlAiDataHandle()
{
//初始化为中文
CurrentCulture = ECultureTeam::ZH;
}
void SlAiDataHandle::ChangeLocalzationCulture(ECultureTeam Culture)
{
switch (Culture)
{
case ECultureTeam::EN:
FInternationalization::Get().SetCurrentCulture(TEXT("en"));
break;
case ECultureTeam::ZH:
FInternationalization::Get().SetCurrentCulture(TEXT("zh"));
break;
}
//赋值
CurrentCulture = Culture;
}
SlAiGameOptionWidget.cpp
#include "SSlAiGameOptionWidget.h"
#include "SlateOptMacros.h"
#include"SlAiStyle.h"
#include "SlAiMenuWidgetStyle.h"
#include"SBox.h"
#include"SImage.h"
#include"SOverlay.h"
#include"STextBlock.h"
#include"SBoxPanel.h"
#include"SCheckBox.h"
#include"SlAiDataHandle.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiGameOptionWidget::Construct(const FArguments& InArgs)
{
ChildSlot
[
SNew(SBox)
.WidthOverride(500.f)
.HeightOverride(300.f)
[
SNew(SOverlay)
+SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
[
SNew(SImage)
.Image(&SlAiStyle::GetMenuStyle()->GameOptionBGBrush)
]
+SOverlay::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
.Padding(FMargin(50.f))
[
SNew(SVerticalBox)
//切换中英文
+SVerticalBox::Slot()
.HAlign(HAlign_Fill)
.VAlign(VAlign_Fill)
.FillHeight(1.f)
[
SNew(SHorizontalBox)
+SHorizontalBox::Slot()
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
.FillWidth(1.f)
[
//中文切换
SAssignNew(ZhCheckBox,SCheckBox)
.OnCheckStateChanged(this,&SSlAiGameOptionWidget::ZhCheckBoxStateChanged)
[
SNew(STextBlock)
.Font(SlAiStyle::GetMenuStyle()->Font_40)
//颜色和透明度
.ColorAndOpacity(SlAiStyle::GetMenuStyle()->FontColor_Black)
.Text(NSLOCTEXT("SlAiMenu","Chinese","Chinese"))
]
]
+SHorizontalBox::Slot()
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
.FillWidth(1.f)
[
//英文切换
SAssignNew(EnCheckBox,SCheckBox)
.OnCheckStateChanged(this,&SSlAiGameOptionWidget::EnCheckBoxStateChanged)
[
SNew(STextBlock)
.Font(SlAiStyle::GetMenuStyle()->Font_40)
.ColorAndOpacity(SlAiStyle::GetMenuStyle()->FontColor_Black)
.Text(NSLOCTEXT("SlAiMenu","English","English"))
]
]
//初始化CheckBox的样式
StyleInitialize();
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
//初始化CheckBox的样式
void SSlAiGameOptionWidget::StyleInitialize()
{
//设置ZhCheckBox样式
ZhCheckBox->SetUncheckedImage(&SlAiStyle::GetMenuStyle()->UnCheckedBoxBrush);
ZhCheckBox->SetUncheckedHoveredImage(&SlAiStyle::GetMenuStyle()->UnCheckedBoxBrush);
ZhCheckBox->SetUncheckedPressedImage(&SlAiStyle::GetMenuStyle()->UnCheckedBoxBrush);
ZhCheckBox->SetCheckedImage(&SlAiStyle::GetMenuStyle()->CheckedBoxBrush);
ZhCheckBox->SetCheckedHoveredImage(&SlAiStyle::GetMenuStyle()->CheckedBoxBrush);
ZhCheckBox->SetCheckedPressedImage(&SlAiStyle::GetMenuStyle()->CheckedBoxBrush);
//设置EnCheckBox样式
EnCheckBox->SetUncheckedImage(&SlAiStyle::GetMenuStyle()->UnCheckedBoxBrush);
EnCheckBox->SetUncheckedHoveredImage(&SlAiStyle::GetMenuStyle()->UnCheckedBoxBrush);
EnCheckBox->SetUncheckedPressedImage(&SlAiStyle::GetMenuStyle()->UnCheckedBoxBrush);
EnCheckBox->SetCheckedImage(&SlAiStyle::GetMenuStyle()->CheckedBoxBrush);
EnCheckBox->SetCheckedHoveredImage(&SlAiStyle::GetMenuStyle()->CheckedBoxBrush);
EnCheckBox->SetCheckedPressedImage(&SlAiStyle::GetMenuStyle()->CheckedBoxBrush);
switch (SlAiDataHandle::Get()->CurrentCulture)
{
case ECultureTeam::EN:
EnCheckBox->SetIsChecked(ECheckBoxState::Checked);
ZhCheckBox->SetIsChecked(ECheckBoxState::Unchecked);
break;
case ECultureTeam::ZH:
ZhCheckBox->SetIsChecked(ECheckBoxState::Checked);
EnCheckBox->SetIsChecked(ECheckBoxState::Unchecked);
break;
}
}
void SSlAiGameOptionWidget::ZhCheckBoxStateChanged(ECheckBoxState NewState)
{
//设置被选中的框
ZhCheckBox->SetIsChecked(ECheckBoxState::Checked);
EnCheckBox->SetIsChecked(ECheckBoxState::Unchecked);
//告诉数据控制类转换为中文
SlAiDataHandle::Get()->ChangeLocalzationCulture(ECultureTeam::ZH);
}
void SSlAiGameOptionWidget::EnCheckBoxStateChanged(ECheckBoxState NewState)
{
//设置被选中的框
ZhCheckBox->SetIsChecked(ECheckBoxState::Unchecked);
EnCheckBox->SetIsChecked(ECheckBoxState::Checked);
//告诉数据控制类转换为中文
SlAiDataHandle::Get()->ChangeLocalzationCulture(ECultureTeam::EN);
}
将SlAiGameOptionWidget插入SlAiMenuWidget中
SlAiMenuWidget.cpp
...
#include "SSlAiGameOptionWidget.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SSlAiMenuWidget::Construct(const FArguments& InArgs)
{
...
+SOverlay::Slot()
.HAlign(HAlign_Center)
.VAlign(VAlign_Top)
.Padding(FMargin(0.f,130.f,0.f,0.f))
[
//创建一个SVerticalBox
SAssignNew(ContentBox,SVerticalBox)
]
]
];
...
//将SSlAiGameOptionWidget插入ContentBox
ContentBox->AddSlot()
[
SNew(SSlAiGameOptionWidget)
];
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
...
设置BPSlAiMenuStyle
运行
SlAiGameOptionWidget 主要是调整显示的样式画刷和调用切换中英文的方法。
单例类SlAiDataHandle 初始化文本的语言和定义切换中英文的方法。
//中文切换
SAssignNew(ZhCheckBox,SCheckBox)
//SLATE_EVENT( FOnCheckStateChanged, OnCheckStateChanged )
.OnCheckStateChanged(this,&SSlAiGameOptionWidget::ZhCheckBoxStateChanged)
//英文切换
SAssignNew(EnCheckBox,SCheckBox)
.OnCheckStateChanged(this,&SSlAiGameOptionWidget::EnCheckBoxStateChanged)
void SSlAiGameOptionWidget::ZhCheckBoxStateChanged(ECheckBoxState NewState)
{
//设置被选中的框
...
//告诉数据控制类转换为中文
SlAiDataHandle::Get()->ChangeLocalzationCulture(ECultureTeam::ZH);
}
void SSlAiGameOptionWidget::EnCheckBoxStateChanged(ECheckBoxState NewState)
{
//设置被选中的框
...
//告诉数据控制类转换为中文
SlAiDataHandle::Get()->ChangeLocalzationCulture(ECultureTeam::EN);
}
void SlAiDataHandle::ChangeLocalzationCulture(ECultureTeam Culture)
{
switch (Culture)
{
case ECultureTeam::EN:
FInternationalization::Get().SetCurrentCulture(TEXT("en"));
break;
case ECultureTeam::ZH:
FInternationalization::Get().SetCurrentCulture(TEXT("zh"));
break;
}
//赋值
CurrentCulture = Culture;
}
ECheckBoxState 有三种状态:
未勾选
勾选
既未选中也未选中