七、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 有三种状态:
未勾选
勾选
既未选中也未选中

Guess you like

Origin blog.csdn.net/m0_51032168/article/details/121465207