Ue4C++编程------保存游戏与c++(一)

    在单击游戏中,一般都有保存游戏的选项,在这篇博客中,我就来讲讲如何保存游戏,然后在开始游戏时,读取我们保存的信息,进行恢复游戏。

    在讲述保存游戏之前,先来介绍GameInstance这个类,在UE4中,gameinstance是伴随整个游戏进程的,我们知道,gamemode是每个关卡都有不同的gamemode,所以呢,要保存伴随整个游戏进程都有效的数据,应该放在gameinstance中,所以,我们首先创建一个继承自gameinstance的类,如下图所示:

    

    在新创建的gameinstance类中,添加一个FVector类型的成员,并创建该成员的setter和getter函数,如下所示:

private:
	FVector HeroLocation;
	
public:
	const FVector& GetHeroLocation() const { return HeroLocation; }

	void SetHeroLocation(const FVector& Location) { HeroLocation = Location; }

    接着我们创建一个新类,继承自savegame类,如下图所示:

    

    然后在savegame类中,添加一个public成员,FVector类型的,表示hero的位置,如下所示:

public:
        UPROPERTY(EditAnywhere)
	FVector LastLocation;

    在我们的gameinstance类中,创建一个成员,作为存档成员,如下所示:

class UBlogSaveGame* SaveGame;
FORCEINLINE class UBlogSaveGame* GetSaveGame() { return SaveGame; }

    然后在构造函数中,初始化创建我们的存档指针,如下所示:

UBlogGameInstance::UBlogGameInstance()
{
	// 先检测是否有存档 
	bool bRet = UGameplayStatics::DoesSaveGameExist(TEXT("HeroLocation"), 0);
	if (bRet) // 如果有存档,则读取记录
	{
		SaveGame = Cast<UBlogSaveGame>(UGameplayStatics::LoadGameFromSlot(TEXT("HeroLocation"), 0));
		if (SaveGame)
		{
			HeroLocation = SaveGame->LastLocation; // 读取最后一次保存的位置
			bLoadGame = true;
		}
	}
	else // 没有 则先创建存档
	{
		SaveGame = Cast<UBlogSaveGame>(UGameplayStatics::CreateSaveGameObject(UBlogSaveGame::StaticClass()));
		bLoadGame = false;
	}
}

    然后在我们的character的beginplay函数中,我们获取gameinstance中的数据,如果读取了游戏,则在新的位置放置我们的character。如下所示:

	UBlogGameInstance* GI = Cast<UBlogGameInstance>(GetWorld()->GetGameInstance());
	if (GI != nullptr && GI->bLoadGame) // 如果是读取游戏
	{
		SetActorLocation(GI->GetHeroLocation()); // 设置到上一次保存的位置
	}

    接着是保存游戏,我们按之前的绑定动作按钮,我们绑定F10为保存游戏的按钮,实现如下:

void ABlogProjectCharacter::SaveGame()
{
	UBlogGameInstance* GI = Cast<UBlogGameInstance>(GetWorld()->GetGameInstance());
	UE_LOG(LogTemp, Warning, TEXT("SaveGame: ClassName: %s, %d"), *(GI->GetName()), 1);
	if (GI != nullptr) // save game必须要创建新的文件
	{
		UBlogSaveGame* SaveGameInstance = Cast<UBlogSaveGame>(UGameplayStatics::CreateSaveGameObject(UBlogSaveGame::StaticClass()));
		SaveGameInstance->LastLocation = GetActorLocation();
		UGameplayStatics::SaveGameToSlot(SaveGameInstance, TEXT("HeroLocation"), 0); // 保存游戏
	}
}

    然后在设置中,更改我们的gameinstance为上面创建的类,如下图所示:

    

    经测试,成功。


在非GameInstance中编写Replay可以分为以下几个步骤: 1. 创建Replay保存文件 首先,需要在游戏中定义个Replay保存文件。这个文件可以在游戏启动时创建,也可以在需要保存Replay时创建。般来说,我们可以将Replay保存文件定义为个FString类型的变量,并在需要时进行初始化。例如: ```cpp FString ReplayFilename; ``` 2. 开始Replay录制 旦定义了Replay保存文件,就可以开始录制Replay了。这个过程般分为两步:开始录制和结束录制。 开始录制Replay可以使用UEngine::NetworkRemapPath函数。这个函数可用于将网络路径(例如“/Game/Maps/MyMap”)重定向到Replay保存文件。例如: ```cpp ReplayFilename = FString("MyReplay.replay"); GetEngine()->NetworkRemapPath("/Game/Maps/MyMap", *ReplayFilename); ``` 旦调用了NetworkRemapPath函数,游戏就会开始录制Replay。在录制期间,所有游戏事件都被记录并保存到Replay文件中。 3. 停止Replay录制 当需要停止Replay录制时,可以使用UEngine::NetworkRemapPath函数将重定向路径恢复到原始状态。例如: ```cpp GetEngine()->NetworkRemapPath("/Game/Maps/MyMap", "/Game/Maps/MyMap"); ``` 这个过程会将重定向路径从Replay保存文件恢复到原始路径,并停止录制Replay。 4. 回放Replay 旦Replay被录制,就可以进行回放了。回放过程可以在任何时候进行,不定需要在GameInstance中进行。般来说,我们可以将回放过程封装在UE4蓝图中,然后在需要时进行调用。 回放Replay的过程录制过程类似,只需要将NetworkRemapPath函数的参数改为Replay保存文件的路径即可。例如: ```cpp ReplayFilename = FString("MyReplay.replay"); GetEngine()->NetworkRemapPath(*ReplayFilename, "/Game/Maps/MyMap"); ``` 这个过程会将网络路径重定向到Replay保存文件,然后开始回放Replay。在回放期间,游戏会根据保存的Replay事件来模拟游戏过程。 以上就是在非GameInstance中编写Replay的详细案例。需要注意的是,Replay录制和回放过程中需要保存和读取的数据非常多,因此需要仔细设计数据结构和算法,以确保Replay文件的正确性和可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值