[UE4入门笔记(7)] 18.音量调节 19.场景跳转 20.GameInstance的保存数据功能 21.创建新Map的一些思考 22.UE4创建Component --梁迪老师UE4纯C++&

本文介绍了在UE4中使用C++进行项目开发时如何进行音量调节,通过转换为SoundCue类型实现。同时讲解了场景跳转的实现方式,通过UGameplayStatics::OpenLevel函数。还探讨了GameInstance在保存数据方面的功能,并创建新的Map时的注意事项,包括指定GameMode和创建Component的方法。
摘要由CSDN通过智能技术生成

前言:

笔者目前在校本科大三,目标方向是人工智能、计算机视觉。上一个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类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值