前言:
笔者目前在校本科大三,目标方向是人工智能、计算机视觉。上一个OpenCV学习笔记专栏已完结,在学习完OpenCV后,我继续学习C++,并用纯C++做UE4项目的方式继续提升自己的水平。
梁迪老师的水平非常高,他的课程本来也无需笔记:课程本身即为最好的笔记。但由于我天赋有限,还是边看边记,以防遗忘——知识点太多,步骤太繁杂了。在学习过程中,我也偶有思考,思索为什么某个方法老师要这样做。所以,一是为了记录,二是为了分享,才有了这个专栏。
内容方面,由于我在开启这个专栏时,此项目已经做完很多了。所以,前期的一些大篇幅叙述的知识,可能在后期应用中一带而过。以及,前期的一些知识,后期会重新剖析,并加上我的个人理解。
另外,若有学术交流/学业交流意愿,可以邮件联系1246210283@qq.com,希望一齐进步。
本篇学习内容:
18.音量调节
19.场景跳转
20.GameInstance的保存数据功能
21.创建新Map的一些思考
22.UE4创建Component
18.音量调节
FSlateSound无法进行音量调节,需要转换为SoundCue类型。
(1)在Datahandle中获取到音频,然后存放到一个TMap里
//保存Menu的声音
TMap<FString, TArray<USoundCue*>> MenuAudioResource;
//获取Menu样式,里面存放有声音文件
const struct FSlAiMenuStyle *MenuStyle;
(2)然后实现一个InitializedMenuAudio()函数
void SlAiDataHandle::InitializedMenuAudio()
{
//获取编译器的MenuStyle
MenuStyle = &SlAiStyle::Get().GetWidgetStyle<FSlAiMenuStyle>("BPSlAiMenuStyle");
//添加资源文件到资源列表
TArray<USoundCue*> MusicList;
MusicList.Add(Cast<USoundCue>(MenuStyle->MenuBackgroundMusic.GetResourceObject()));//转换为USoundCue才能对它的音量进行设置
TArray<USoundCue*> SoundList;
SoundList.Add(Cast<USoundCue>(MenuStyle->StartGameSound.GetResourceObject()));
SoundList.Add(Cast<USoundCue>(MenuStyle->ExitGameSound.GetResourceObject()));
SoundList.Add(Cast<USoundCue>(MenuStyle->MenuItemChangeSound.GetResourceObject()));
//添加资源到Map
MenuAudioResource.Add(FString("Music"), MusicList);
MenuAudioResource.Add(FString("Sound"), SoundList);
//重置一下声音
ResetMenuVolume(MusicVolume, SoundVolume);
}
(3)在之前的ResetMenuVolume()函数中添加对应的代码
//循环设置背景音量
for (TArray<USoundCue*>::TIterator It(MenuAudioResource.Find(FString("Music"))->CreateIterator()); It; ++It) {
//设置音量
(*It)->VolumeMultiplier = MusicVolume;
}
19.场景跳转
在UE4编辑器里创建一个新场景GameMap,随后在MenuWidget中实现EnterGame函数:
void SSlAiMenuWidget::EnterGame()
{
UGameplayStatics::OpenLevel(UGameplayStatics::GetPlayerController(GWorld, 0)->GetWorld(), FName("GameMap"));
ControlLocked = false;
}
注意,还需要完善一下EnterRecord对应的事件:
case EMenuItem::EnterRecord:
//告诉选择存档更新存档名
ChooseRecordWidget->UpdateRecordName();
SlAiHelper::PlayerSoundAndCall(UGameplayStatics::GetPlayerController(GWorld, 0)->GetWorld(), MenuStyle->StartGameSound, this,
&SSlAiMenuWidget::EnterGame);
break;
20.GameInstance的保存数据功能
新建一个GameInstance,在.h文件中创建一个变量:
UPROPERTY(VisibleAnywhere, Category = "SlAi")
FString GameName;
随后,进行试验:
在GameMode中:
void ASlAiGameMode::BeginPlay()
{
SlAiHelper::Debug(FString("DataHandle : ") + SlAiDataHandle::Get()->RecordName, 30.f);
SlAiHelper::Debug(FString("GameInstance : ") + Cast<USlAiGameInstance>(UGameplayStatics::GetGameInstance(GetWorld()))->GameName, 30.f);
}
注1:这个函数为vitrual void BeginPlay() override;
注2: 在创建完GameInstance后,需要在项目设置内的GameInstance中修改为自己创建的SlAiGameInstance。
运行游戏,顺利输出两个变量对应的字符串。
这说明,GameInstance和我们自己创建的DataHandle都拥有保存数据的功能。
21.创建新Map的一些思考
创建一个新的Map后,需要创建一个GameModeBase,随后在UE4编辑器内指定GameMode为此类。
随后,如果需要指定某个类到此GameModeBase类下,则需要写其的构造函数,在其中用StaticClass来指定,如:HUDClass = ASlAiGameHUD::StaticClass();
运行项目后,若World Settings下已显示出指定好的类,说明已经绑定成功了。
22.UE4创建Component
CreateDefaultSubobject<T>()
在构造函数使用
NewObject<T>
在任何地方使用 用来创建UObject类型