金币类就是学习篇五和六的Actor创建和碰撞处理,添加完金币的模型和设置完参数,我们就可以处理一下把金币数量保存,下次进入游戏的时候还是上次的金币数量。使用到的类就是SaveGame类。
我这边是把这个读取和加载放到了PlayerController类中处理,没有直接放到角色身上,这里只是学习如何使用,具体应该放到哪里,应该根据自己的需求处理。
变量添加:
//玩家金币数量
int32 PlayerCoins;
//保存游戏的类指针
UFPSSaveGame* SaveGameInstance;
//保存游戏插槽名称
FString SaveGameSlotName;
保存:
//如果不存在,创建
if (!SaveGameInstance)
{
SaveGameInstance = Cast<UFPSSaveGame>(UGameplayStatics::CreateSaveGameObject(UFPSSaveGame::StaticClass()));
}
//赋值
SaveGameInstance->PlayerCoins = PlayerCoins;
//保存
UGameplayStatics::SaveGameToSlot(SaveGameInstance, SaveGameSlotName, 0);
1.先判断SaveGame类是否存在,不存在,根据CreateSaveGameObject创建一个对象;
2.为自己保存的数值赋值;
3.SaveGameToSlot,根据保存名称和index,保存在自己的这个对象实例中;
读取:
//如果不存在,读取
if (!SaveGameInstance)
{
SaveGameInstance = Cast<UFPSSaveGame>(UGameplayStatics::LoadGameFromSlot(TEXT("PlayerCoins"), 0));
}
//赋值
PlayerCoins = SaveGameInstance->PlayerCoins;
1.判断存储对象实例是否存在,不存在通过LoadGameFromSlot获取到对象实例;
2.对自己的数据进行赋值;
注:SaveGame类的存储目前是针对比较简单的数据类型进行存储,后续用到复杂的存储时,会另写一篇。
我这边是碰撞到之后,进行一次数据保存。
const AFPSShootingGameCharacter* Character = Cast<AFPSShootingGameCharacter>(OtherActor);
if (nullptr != Character)
{
AFGPlayerController* PC = Cast<AFGPlayerController>(Character->GetController());
if (nullptr != PC)
{
PC->AddPlayerCoins(1);
//保存数据
PC->SaveGame();
int32 num = PC->GetPlayerCoins();
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("Player Coins:%d!"), num));
}
}
参考:《Ue4C++编程------保存游戏与c++(一)》
作者:li2818
附加:
保存在本地的路径: