UE4 从无到有纯 C++ & Slate 开发沙盒游戏(九) 游戏设置控件
制作游戏的设置菜单,具体功能包括设置游戏的语言以及音量大小
首先新建一个Slate Widget的类
D:\UE4 Project\UE26.2\CourseProject\SlAiCourse\Source\SlAiCourse\Public\UI\Widget\SSlAiGameOptionWidget.h
1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "Data/SlAiTypes.h" 7 #include "Widgets/SCompoundWidget.h" 8 9 class SCheckBox; 10 class SSlider; 11 class STextBlock; 12 13 /************************************************************************/ 14 /* 为了方便模块化管理,将设置界面中的一些内容放到菜单中,建立两个委托 */ 15 /************************************************************************/ 16 //修改中英文委托 17 DECLARE_DELEGATE_OneParam(FChangeCulture, const ECultureTeam) 18 //修改音量委托 19 DECLARE_DELEGATE_TwoParams(FChangeVolume, const float, const float) 20 21 22 class SLAICOURSE_API SSlAiGameOptionWidget : public SCompoundWidget 23 { 24 public: 25 SLATE_BEGIN_ARGS(SSlAiGameOptionWidget) 26 {} 27 28 //改变语言事件(委托名,事件方法) 29 SLATE_EVENT(FChangeCulture, ChangeCulture) 30 //改变音量事件 31 SLATE_EVENT(FChangeVolume, ChangeVolume) 32 33 SLATE_END_ARGS() 34 35 /** Constructs this widget with InArgs */ 36 void Construct(const FArguments& InArgs); 37 38 private: 39 40 //统一设置样式 41 void StyleInitialize(); 42 //中文CheckBox事件 43 void ZhCheckBoxStateChanged(ECheckBoxState NewState); 44 //英文CheckBox事件 45 void EnCheckBoxStateChanged(ECheckBoxState NewState); 46 //音量变化事件 47 void MusicSliderChanged(float value); 48 //音效变化事件 49 void SoundSliderChanged(float value); 50 51 private: 52 53 //获取MenuStyle 54 const struct FSlAiMenuStyle* MenuStyle; 55 56 //获取CheckBox指针 57 TSharedPtr<SCheckBox> EnCheckBox; 58 TSharedPtr<SCheckBox> ZhCheckBox; 59 60 //两个进度条 61 TSharedPtr<SSlider> MuSlider; 62 TSharedPtr<SSlider> SoSlider; 63 64 //进度条百分比 65 TSharedPtr<STextBlock> MuTextBlock; 66 TSharedPtr<STextBlock> SoTextBlock; 67 68 //委托变量 69 FChangeCulture ChangeCulture; 70 FChangeVolume ChangeVolume; 71 72 };
D:\UE4 Project\UE26.2\CourseProject\SlAiCourse\Source\SlAiCourse\Private\UI\Widget\SSlAiGameOptionWidget.cpp
1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 4 #include "UI/Widget/SSlAiGameOptionWidget.h" 5 #include "SlateOptMacros.h" 6 #include "UI/Style/SlAiStyle.h" 7 #include "UI/Style/SlAiMenuWidgetStyle.h" 8 #include "Widgets/Layout/SBorder.h" 9 #include "Widgets/Layout/SBox.h" 10 #include "Widgets/Images/SImage.h" 11 #include "Widgets/SOverlay.h" 12 #include "Widgets/Text/STextBlock.h" 13 #include "Widgets/SBoxPanel.h" 14 #include "Widgets/Input/SCheckBox.h" 15 #include "Widgets/Input/SSlider.h" 16 17 #include "Data/SlAiDataHandle.h" 18 19 20 BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION 21 void SSlAiGameOptionWidget::Construct(const FArguments& InArgs) 22 { 23 //获取MenuStyle 24 MenuStyle = &SlAiStyle::Get().GetWidgetStyle<FSlAiMenuStyle>("BPSlAiMenuStyle"); 25 26 //获取委托 27 ChangeCulture = InArgs._ChangeCulture; 28 ChangeVolume = InArgs._ChangeVolume; 29 30 ChildSlot 31 [ 32 SNew(SBox) 33 .WidthOverride(500.f) 34 .HeightOverride(300.f) 35 [ 36 SNew(SOverlay) 37 + SOverlay::Slot() 38 .HAlign(HAlign_Fill) 39 .VAlign(VAlign_Fill) 40 [ 41 SNew(SImage) 42 .Image(&MenuStyle->GameOptionBGBrush) 43 ] 44 45 + SOverlay::Slot() 46 .HAlign(HAlign_Fill) 47 .VAlign(VAlign_Fill) 48 .Padding(FMargin(50.f)) 49 [ 50 SNew(SVerticalBox) 51 //第一行 52 +SVerticalBox::Slot() 53 .HAlign(HAlign_Fill) 54 .VAlign(VAlign_Fill) 55 .FillHeight(1.f) 56 [ 57 SNew(SHorizontalBox) 58 59 +SHorizontalBox::Slot() //中文 60 .HAlign(HAlign_Center) 61 .VAlign(VAlign_Center) 62 .FillWidth(1.f) 63 [ 64 SAssignNew(ZhCheckBox, SCheckBox) 65 .OnCheckStateChanged(this, &SSlAiGameOptionWidget::ZhCheckBoxStateChanged) 66 [ 67 SNew(STextBlock) 68 .Font(MenuStyle->Font_40) 69 .ColorAndOpacity(MenuStyle->FontColor_Black) 70 .Text(NSLOCTEXT("SlAiMenu", "Chinese", "Chinese")) 71 ] 72 ] 73 74 + SHorizontalBox::Slot() //英文 75 .HAlign(HAlign_Center) 76 .VAlign(VAlign_Center) 77 .FillWidth(1.f) 78 [ 79 SAssignNew(EnCheckBox, SCheckBox) 80 .OnCheckStateChanged(this, &SSlAiGameOptionWidget::EnCheckBoxStateChanged) 81 [ 82 SNew(STextBlock) 83 .Font(MenuStyle->Font_40) 84 .ColorAndOpacity(MenuStyle->FontColor_Black) 85 .Text(NSLOCTEXT("SlAiMenu", "English", "English")) 86 ] 87 ] 88 ] 89 90 //第二行 91 +SVerticalBox::Slot() 92 .HAlign(HAlign_Fill) 93 .VAlign(VAlign_Fill) 94 .FillHeight(1.f) 95 [ 96 SNew(SOverlay) 97 98 +SOverlay::Slot() //音乐两个字 99 .HAlign(HAlign_Left) 100 .VAlign(VAlign_Center) 101 [ 102 SNew(STextBlock) 103 .Font(MenuStyle->Font_40) 104 .ColorAndOpacity(MenuStyle->FontColor_Black) 105 .Text(NSLOCTEXT("SlAiMenu", "Music", "Music")) 106 ] 107 108 +SOverlay::Slot() //滑动条 109 .HAlign(HAlign_Center) 110 .VAlign(VAlign_Center) 111 [ 112 SNew(SBox) 113 .WidthOverride(240.f) 114 [ 115 SNew(SOverlay) 116 +SOverlay::Slot() 117 .HAlign(HAlign_Fill) 118 .VAlign(VAlign_Center) 119 .Padding(FMargin(30.f, 0.f)) 120 [ 121 SNew(SImage) 122 .Image(&MenuStyle->SliderBarBrush) 123 ] 124 125 +SOverlay::Slot() //滑块 126 .HAlign(HAlign_Fill) 127 .VAlign(VAlign_Center) 128 [ 129 SAssignNew(MuSlider, SSlider) 130 .Style(&MenuStyle->SliderStyle) 131 .OnValueChanged(this, &SSlAiGameOptionWidget::MusicSliderChanged) 132 ] 133 ] 134 ] 135 136 +SOverlay::Slot() //右侧百分比 137 .HAlign(HAlign_Right) 138 .VAlign(VAlign_Center) 139 [ 140 SAssignNew(MuTextBlock, STextBlock) 141 .Font(MenuStyle->Font_40) 142 .ColorAndOpacity(MenuStyle->FontColor_Black) 143 ] 144 ] 145 146 //第三行 147 + SVerticalBox::Slot() 148 .HAlign(HAlign_Fill) 149 .VAlign(VAlign_Fill) 150 .FillHeight(1.f) 151 [ 152 SNew(SOverlay) 153 154 + SOverlay::Slot() //音效两个字 155 .HAlign(HAlign_Left) 156 .VAlign(VAlign_Center) 157 [ 158 SNew(STextBlock) 159 .Font(MenuStyle->Font_40) 160 .ColorAndOpacity(MenuStyle->FontColor_Black) 161 .Text(NSLOCTEXT("SlAiMenu", "Sound", "Sound")) 162 ] 163 164 + SOverlay::Slot() //滑动条 165 .HAlign(HAlign_Center) 166 .VAlign(VAlign_Center) 167 [ 168 SNew(SBox) 169 .WidthOverride(240.f) 170 [ 171 SNew(SOverlay) 172 173 + SOverlay::Slot() 174 .HAlign(HAlign_Fill) 175 .VAlign(VAlign_Center) 176 .Padding(FMargin(30.f, 0.f)) 177 [ 178 SNew(SImage) 179 .Image(&MenuStyle->SliderBarBrush) 180 ] 181 182 + SOverlay::Slot() //滑块 183 .HAlign(HAlign_Fill) 184 .VAlign(VAlign_Center) 185 [ 186 SAssignNew(SoSlider, SSlider) 187 .Style(&MenuStyle->SliderStyle) 188 .OnValueChanged(this, &SSlAiGameOptionWidget::SoundSliderChanged) 189 ] 190 ] 191 ] 192 193 + SOverlay::Slot() //右侧百分比 194 .HAlign(HAlign_Right) 195 .VAlign(VAlign_Center) 196 [ 197 SAssignNew(SoTextBlock, STextBlock) 198 .Font(MenuStyle->Font_40) 199 .ColorAndOpacity(MenuStyle->FontColor_Black) 200 ] 201 ] 202 ] 203 ] 204 ]; 205 206 StyleInitialize(); 207 } 208 209 void SSlAiGameOptionWidget::StyleInitialize() 210 { 211 //设置ZhCheckBox样式 212 ZhCheckBox->SetUncheckedImage(&MenuStyle->UnCheckedBoxBrush); 213 ZhCheckBox->SetUncheckedHoveredImage(&MenuStyle->UnCheckedBoxBrush); 214 ZhCheckBox->SetUncheckedPressedImage(&MenuStyle->UnCheckedBoxBrush); 215 ZhCheckBox->SetCheckedImage(&MenuStyle->CheckedBoxBrush); 216 ZhCheckBox->SetCheckedHoveredImage(&MenuStyle->CheckedBoxBrush); 217 ZhCheckBox->SetCheckedPressedImage(&MenuStyle->CheckedBoxBrush); 218 219 //设置EnCheckBox样式 220 EnCheckBox->SetUncheckedImage(&MenuStyle->UnCheckedBoxBrush); 221 EnCheckBox->SetUncheckedHoveredImage(&MenuStyle->UnCheckedBoxBrush); 222 EnCheckBox->SetUncheckedPressedImage(&MenuStyle->UnCheckedBoxBrush); 223 EnCheckBox->SetCheckedImage(&MenuStyle->CheckedBoxBrush); 224 EnCheckBox->SetCheckedHoveredImage(&MenuStyle->CheckedBoxBrush); 225 EnCheckBox->SetCheckedPressedImage(&MenuStyle->CheckedBoxBrush); 226 227 switch (SlAiDataHandle::Get()->CurrentCulture) 228 { 229 case ECultureTeam::EN: 230 EnCheckBox->SetIsChecked(ECheckBoxState::Checked); 231 ZhCheckBox->SetIsChecked(ECheckBoxState::Unchecked); 232 break; 233 case ECultureTeam::ZH: 234 EnCheckBox->SetIsChecked(ECheckBoxState::Unchecked); 235 ZhCheckBox->SetIsChecked(ECheckBoxState::Checked); 236 break; 237 } 238 239 MuSlider->SetValue(SlAiDataHandle::Get()->MusicVolume); 240 SoSlider->SetValue(SlAiDataHandle::Get()->SoundVolume); 241 242 MuTextBlock->SetText(FText::FromString(FString::FromInt(FMath::RoundToInt(SlAiDataHandle::Get()->MusicVolume * 100)) + FString("%"))); 243 SoTextBlock->SetText(FText::FromString(FString::FromInt(FMath::RoundToInt(SlAiDataHandle::Get()->SoundVolume * 100)) + FString("%"))); 244 } 245 246 END_SLATE_FUNCTION_BUILD_OPTIMIZATION 247 248 void SSlAiGameOptionWidget::EnCheckBoxStateChanged(ECheckBoxState NewState) 249 { 250 //设置被选中的框 251 EnCheckBox->SetIsChecked(ECheckBoxState::Checked); 252 ZhCheckBox->SetIsChecked(ECheckBoxState::Unchecked); 253 //告诉数据控制类转换为英文 254 /* 255 * 改委托之前的写法 256 * SlAiDataHandle::Get()->ChangeLocalizationCulture(ECultureTeam::EN); 257 */ 258 ChangeCulture.ExecuteIfBound(ECultureTeam::EN); 259 } 260 261 void SSlAiGameOptionWidget::ZhCheckBoxStateChanged(ECheckBoxState NewState) 262 { 263 //设置被选中的框 264 EnCheckBox->SetIsChecked(ECheckBoxState::Unchecked); 265 ZhCheckBox->SetIsChecked(ECheckBoxState::Checked); 266 //告诉数据控制类转换为中文 267 /* 268 * 改委托之前的写法 269 * SlAiDataHandle::Get()->ChangeLocalizationCulture(ECultureTeam::ZH); 270 */ 271 ChangeCulture.ExecuteIfBound(ECultureTeam::ZH); 272 } 273 274 void SSlAiGameOptionWidget::MusicSliderChanged(float Value) 275 { 276 //显示百分比 277 MuTextBlock->SetText(FText::FromString(FString::FromInt(FMath::RoundToInt(Value * 100)) + FString("%"))); 278 //修改音量 279 /* 280 * 改委托之前的写法 281 * SlAiDataHandle::Get()->ResetMenuVolume(value, -1.f); 282 */ 283 ChangeVolume.ExecuteIfBound(Value, -1.f); 284 } 285 286 void SSlAiGameOptionWidget::SoundSliderChanged(float Value) 287 { 288 //显示百分比 289 SoTextBlock->SetText(FText::FromString(FString::FromInt(FMath::RoundToInt(Value * 100)) + FString("%"))); 290 //修改音量 291 /* 292 * 改委托之前的写法 293 * SlAiDataHandle::Get()->ResetMenuVolume(-1.f, value); 294 */ 295 ChangeVolume.ExecuteIfBound(-1.f, Value); 296 }
D:\UE4 Project\UE26.2\CourseProject\SlAiCourse\Source\SlAiCourse\Public\Data\SlAiDataHandle.h
1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "SlAiTypes.h" 6 #include "CoreMinimal.h" 7 8 9 class SLAICOURSE_API SlAiDataHandle 10 { 11 public: 12 SlAiDataHandle(); 13 14 static void Initialize(); 15 16 static TSharedPtr<SlAiDataHandle> Get(); 17 18 //修改中英文 19 void ChangeLocalizationCulture(ECultureTeam Culture); 20 //修改菜单音量大小 21 void ResetMenuVolume(float MusicVol, float SoundVol); 22 23 public: 24 /** 25 * 这里没有使用 GamePlay 框架的 GameInstance,变量直接写到C++类中除非你主动销毁,否则他会一直存在 26 */ 27 //语言状态 28 ECultureTeam CurrentCulture; 29 //音乐状态 30 float MusicVolume; 31 //音效状态 32 float SoundVolume; 33 34 35 36 private: 37 //创建单例 38 static TSharedRef<SlAiDataHandle> Create(); 39 40 private: 41 static TSharedPtr<SlAiDataHandle> DataInstance; 42 43 };
D:\UE4 Project\UE26.2\CourseProject\SlAiCourse\Source\SlAiCourse\Private\Data\SlAiDataHandle.cpp
1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 4 #include "Data/SlAiDataHandle.h" 5 #include "Internationalization/Internationalization.h" 6 7 8 TSharedPtr<SlAiDataHandle> SlAiDataHandle::DataInstance = NULL; 9 10 SlAiDataHandle::SlAiDataHandle() 11 { 12 //初始化中文 13 CurrentCulture = ECultureTeam::ZH; 14 //初始化音乐 15 MusicVolume = 0.5f; 16 //初始化音效 17 SoundVolume = 0.5f; 18 } 19 20 void SlAiDataHandle::Initialize() 21 { 22 if (!DataInstance.IsValid()) 23 { 24 DataInstance = Create(); 25 } 26 } 27 28 TSharedPtr<SlAiDataHandle> SlAiDataHandle::Get() 29 { 30 Initialize(); 31 return DataInstance; 32 } 33 34 TSharedRef<SlAiDataHandle> SlAiDataHandle::Create() 35 { 36 /** 37 *MakeShareable 可以用来创建共享指针和共享引用 38 */ 39 TSharedRef<SlAiDataHandle> DataRef = MakeShareable(new SlAiDataHandle()); 40 return DataRef; 41 } 42 43 void SlAiDataHandle::ChangeLocalizationCulture(ECultureTeam Culture) 44 { 45 switch (Culture) 46 { 47 case ECultureTeam::EN: 48 FInternationalization::Get().SetCurrentCulture(TEXT("en")); 49 break; 50 case ECultureTeam::ZH: 51 FInternationalization::Get().SetCurrentCulture(TEXT("zh")); 52 break; 53 } 54 //赋值 55 CurrentCulture = Culture; 56 } 57 58 void SlAiDataHandle::ResetMenuVolume(float MusicVol, float SoundVol) 59 { 60 if (MusicVol > 0) 61 { 62 MusicVolume = MusicVol; 63 } 64 if (SoundVol > 0) 65 { 66 SoundVolume = SoundVol; 67 } 68 }
由于MenuWidget是主菜单,我们要在这里实例化所有的功能控件,所有的事件都会放到这里
这样的好处是到后面加了其他场景后,用到这些组件的时候,实例化一个别的方法添加到事件里,就可以重复调用了
D:\UE4 Project\UE26.2\CourseProject\SlAiCourse\Source\SlAiCourse\Public\UI\Widget\SSlAiMenuWidget.h
1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #pragma once 4 5 #include "CoreMinimal.h" 6 #include "Data/SlAiTypes.h" 7 #include "Widgets/SCompoundWidget.h" 8 9 class SBox; 10 class STextBlock; 11 class SVerticalBox; 12 13 class SLAICOURSE_API SSlAiMenuWidget : public SCompoundWidget 14 { 15 public: 16 SLATE_BEGIN_ARGS(SSlAiMenuWidget) 17 {} 18 19 20 SLATE_END_ARGS() 21 22 /** Constructs this widget with InArgs */ 23 void Construct(const FArguments& InArgs); 24 25 private: 26 //绑定到各个MenuItem的方法 27 void MenuItemOnClicked(EMenuItem::Type ItemType); 28 /** 29 * 由于MenuWidget是主菜单,我们要在这里实例化所有的功能控件,所有的事件都会放到这里 30 * 这样的好处是到后面加了其他场景后,用到这些组件的时候,实例化一个别的方法添加到事件里,就可以重复调用了 31 */ 32 //修改语言 33 void ChangeCulture(ECultureTeam Culture); 34 //修改音量 35 void ChangeVolume(const float MusicVolume, const float SoundVolume); 36 37 private: 38 //保存根节点,用来动态的修改SBox的大小 39 TSharedPtr<SBox> RootSizeBox; 40 41 //获取MenuStyle 42 const struct FSlAiMenuStyle* MenuStyle; 43 44 //保存标题 45 TSharedPtr<STextBlock> TitleText; 46 47 //用来保存垂直列表,所有的菜单按钮组件都会放置到这ContentBox中 48 TSharedPtr<SVerticalBox> ContentBox; 49 50 };
D:\UE4 Project\UE26.2\CourseProject\SlAiCourse\Source\SlAiCourse\Private\UI\Widget\SSlAiMenuWidget.cpp
1 // Fill out your copyright notice in the Description page of Project Settings. 2 3 #include "SlateOptMacros.h" 4 #include "UI/Widget/SSlAiMenuWidget.h" 5 #include "UI/Style/SlAiStyle.h" 6 #include "UI/Style/SlAiMenuWidgetStyle.h" 7 #include "UI/Widget/SSlAiGameOptionWidget.h" 8 #include "UI/Widget/SSlAiMenuItemWidget.h" 9 #include "Widgets/Layout/SBox.h" //一版会把SlateWidget的根组件设成SBox 10 #include "Widgets/Images/SImage.h" 11 #include "Widgets/Text/STextBlock.h" 12 #include "Widgets/SBoxPanel.h" 13 #include "Common/SlAiHelper.h" 14 #include "Data/SlAiDataHandle.h" 15 16 //#include "Internationalization/Internationalization.h" //一个关于本地化的头文件 17 18 19 20 BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION 21 void SSlAiMenuWidget::Construct(const FArguments& InArgs) 22 { 23 //获取MenuStyle 24 MenuStyle = &SlAiStyle::Get().GetWidgetStyle<FSlAiMenuStyle>("BPSlAiMenuStyle"); 25 /** 26 *切换语言 27 //FInternationalization::Get().SetCurrentCulture(TEXT("en")); 28 //FInternationalization::Get().SetCurrentCulture(TEXT("ch")); 29 */ 30 //转换为中文 31 SlAiDataHandle::Get()->ChangeLocalizationCulture(ECultureTeam::ZH); 32 33 ChildSlot 34 [ 35 /** 36 *没有Slot,没有Slot要么不能插入子组件,要么只能插入一个子组件,SizeBox 只能插入一个子组件 37 */ 38 SAssignNew(RootSizeBox, SBox) 39 [ 40 SNew(SOverlay) 41 42 +SOverlay::Slot() //主菜单背景 43 .HAlign(HAlign_Fill) 44 .VAlign(VAlign_Fill) 45 .Padding(FMargin(0.f, 50.f, 0.f, 0.f)) //FMargin 间隔(左 上 右 下) 46 [ 47 SNew(SImage) 48 .Image(&MenuStyle->MenuBackgroundBrush) 49 ] 50 51 +SOverlay::Slot() //菜单左侧图片 52 .HAlign(HAlign_Left) 53 .VAlign(VAlign_Center) 54 .Padding(FMargin(0.f, 25.f, 0.f, 0.f)) 55 [ 56 SNew(SImage).Image(&MenuStyle->LeftIconBrush) 57 ] 58 59 +SOverlay::Slot() //菜单右侧图片 60 .HAlign(HAlign_Right) 61 .VAlign(VAlign_Center) 62 .Padding(FMargin(0.f, 25.f, 0.f, 0.f)) 63 [ 64 SNew(SImage).Image(&MenuStyle->RightIconBrush) 65 ] 66 67 +SOverlay::Slot() //菜单标题图片 68 .HAlign(HAlign_Center) 69 .VAlign(VAlign_Top) 70 [ 71 SNew(SBox) 72 .WidthOverride(400.f) 73 .HeightOverride(100.f) 74 [ 75 SNew(SBorder) 76 .BorderImage(&MenuStyle->TitleBorderBrush) 77 .HAlign(HAlign_Center) 78 .VAlign(VAlign_Center) 79 [ 80 SAssignNew(TitleText, STextBlock) 81 .Font(SlAiStyle::Get().GetFontStyle("MenuItemFort")) 82 .Text(NSLOCTEXT("SlAiMenu", "Menu", "Menu")) 83 .Font(MenuStyle->Font_60) 84 ] 85 ] 86 ] 87 88 +SOverlay::Slot() //菜单按钮组件 89 .HAlign(HAlign_Center) 90 .VAlign(VAlign_Top) 91 .Padding(FMargin(0.f, 130.f, 0.f, 0.f)) 92 [ 93 //菜单组件创建到这里 94 SAssignNew(ContentBox, SVerticalBox) 95 ] 96 ] 97 ]; 98 99 /** 100 * RootSizeBox在生成的时候没有设置他的宽和高,这里设置下 101 */ 102 RootSizeBox->SetWidthOverride(600.f); 103 RootSizeBox->SetHeightOverride(510.f); 104 105 ContentBox->AddSlot() 106 [ 107 SNew(SSlAiGameOptionWidget) 108 .ChangeCulture(this, &SSlAiMenuWidget::ChangeCulture) //实例化的时候绑定事件 109 .ChangeVolume(this, &SSlAiMenuWidget::ChangeVolume) 110 ]; 111 } 112 113 END_SLATE_FUNCTION_BUILD_OPTIMIZATION 114 115 void SSlAiMenuWidget::MenuItemOnClicked(EMenuItem::Type ItemType) 116 { 117 //SlAiHelper::Debug(FString("TEXT"), 5.f); 118 } 119 120 void SSlAiMenuWidget::ChangeCulture(ECultureTeam Culture) 121 { 122 SlAiDataHandle::Get()->ChangeLocalizationCulture(Culture); 123 } 124 125 void SSlAiMenuWidget::ChangeVolume(const float MusicVolume, const float SoundVolume) 126 { 127 SlAiDataHandle::Get()->ResetMenuVolume(MusicVolume, SoundVolume); 128 }
滑动条的设置:
在Style中声明笔刷后,UE4中对相关声明内容进行材质设定
Image选择相关UI资源后 Tint → Draw As 设置为 Box
然后通过设置 Margin 的参数
0.5,0.0 后这个图片便会变为下边这个样子
滑动条按钮的设置:
几个参数的含义:
Normal Bar Image:当滑块处于正常状态时,后边背景使用的图像
Hovered Bar Image:当滑块处于悬停状态时,后边背景使用的图像
Disabled Bar Image:当滑块处于禁用状态时,后边背景使用的图像
Normal Thumb Image:当滑块处于正常状态时使用的图像
Hovered Thumb Image:当滑块处于悬停状态时使用的图像
Disabled Thumb Image:当滑块处于禁用状态时使用的图像
Normal Bar Image、Hovered Bar Image、Disabled Bar Image 下的 Tint → Draw As 设置为None(用不到)
Normal Thumb Image、Hovered Thumb Image、Disabled Thumb Image 添加相关滑动的按钮资源便可