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为上面创建的类,如下图所示:

    

    经测试,成功。


猜你喜欢

转载自blog.csdn.net/li2818/article/details/80976485