Fork me on GitHub

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 添加相关滑动的按钮资源便可

 

posted @ 2021-08-16 09:22  索智源  阅读(642)  评论(0编辑  收藏  举报