Unity:如何从游戏中存储一些数据并在下一次恢复它 运行

Unity: How to store some data from the game and restore it on the next run

在我的游戏中,我有一个丰富的收藏品,如果玩家已经收集了它并且 returns 到现场,我希望每个单独的收藏品都不会重生。例如,一个场景中可能有大约一百个这样的收藏品,如果玩家收集了其中一个,离开场景然后 returns,他们收集的那个不会重生,但其余的会重生。

经过一些研究,我认为我应该使用数据序列化来存储哪些收藏品已被收集,哪些还没有,但我不确定如何去做,这个概念对我来说很新.有人可以向我解释一下我应该做什么吗?

谢谢

使用 PlayerPrefs 存储播放器的当前状态。

这些是选项:

  1. PlayerPrefs 不支持布尔值,因此您可以使用整数(0 为假,1 为真)并为每个收藏品分配一个整数。优点:更容易实施。缺点:如果存储的 objects 数量非常多并且 read/write.

  2. 需要更多工作量,则使用太多内存
  3. 将一个整数分配给多个收藏品并按位存储并来回转换。优点:更少的内存和更快的 read/write 大量存储 objects。缺点:将每个整数的数量限制为 int32 中的位数。即 32.

  4. 为所有收藏品分配一个大字符串并来回转换。优点:您可以存储 true/false 以外的更多状态,您也可以使用任何加密来保护数据免受黑客攻击。缺点:我想不出。

选项 1:

//store
PlayerPrefs.SetKey("collectible"+i, isCollected?1:0);

//fetch
isCollected = PlayerPrefs.GetKey("collectible"+i, 0) == 1;

按位:

int bits = 0;//note that collectiblesGroup1Count cannot be greater than 32
for(int i=0; i<collectiblesGroup1Count; i++) 
    if(collectibleGroup1[i].isCollected)
       bits |= (1 << i);

//store
PlayerPrefs.SetKey("collectiblesGroup1", bits);

//fetch
bits = PlayerPrefs.GetKey("collectiblesGroup1", 0);//default value is 0
for(int i=0; i<collectiblesGroup1Count; i++) 
    collectibleGroup1[i].isCollected = (bits && (1 << i)) != 0;

字符串方法:

string bits = "";//consists of many C's and N's each for one collectible
for(int i=0; i<collectiblesCount; i++) 
    bits += collectibleGroup1[i].isCollected ? "C" : "N";

//store
PlayerPrefs.SetKey("collectibles", bits);

//fetch
bits = PlayerPrefs.GetKey("collectibles", "");
for(int i=0; i<collectiblesCount; i++) 
    if(i < bits.Length)
        collectible[i].isCollected = bits[i] == "C";
    else
        collectible[i].isCollected = false;