Unity:如何从游戏中存储一些数据并在下一次恢复它 运行
Unity: How to store some data from the game and restore it on the next run
在我的游戏中,我有一个丰富的收藏品,如果玩家已经收集了它并且 returns 到现场,我希望每个单独的收藏品都不会重生。例如,一个场景中可能有大约一百个这样的收藏品,如果玩家收集了其中一个,离开场景然后 returns,他们收集的那个不会重生,但其余的会重生。
经过一些研究,我认为我应该使用数据序列化来存储哪些收藏品已被收集,哪些还没有,但我不确定如何去做,这个概念对我来说很新.有人可以向我解释一下我应该做什么吗?
谢谢
使用 PlayerPrefs 存储播放器的当前状态。
这些是选项:
PlayerPrefs 不支持布尔值,因此您可以使用整数(0 为假,1 为真)并为每个收藏品分配一个整数。优点:更容易实施。缺点:如果存储的 objects 数量非常多并且 read/write.
需要更多工作量,则使用太多内存
将一个整数分配给多个收藏品并按位存储并来回转换。优点:更少的内存和更快的 read/write 大量存储 objects。缺点:将每个整数的数量限制为 int32 中的位数。即 32.
为所有收藏品分配一个大字符串并来回转换。优点:您可以存储 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;
在我的游戏中,我有一个丰富的收藏品,如果玩家已经收集了它并且 returns 到现场,我希望每个单独的收藏品都不会重生。例如,一个场景中可能有大约一百个这样的收藏品,如果玩家收集了其中一个,离开场景然后 returns,他们收集的那个不会重生,但其余的会重生。
经过一些研究,我认为我应该使用数据序列化来存储哪些收藏品已被收集,哪些还没有,但我不确定如何去做,这个概念对我来说很新.有人可以向我解释一下我应该做什么吗?
谢谢
使用 PlayerPrefs 存储播放器的当前状态。
这些是选项:
PlayerPrefs 不支持布尔值,因此您可以使用整数(0 为假,1 为真)并为每个收藏品分配一个整数。优点:更容易实施。缺点:如果存储的 objects 数量非常多并且 read/write.
需要更多工作量,则使用太多内存
将一个整数分配给多个收藏品并按位存储并来回转换。优点:更少的内存和更快的 read/write 大量存储 objects。缺点:将每个整数的数量限制为 int32 中的位数。即 32.
为所有收藏品分配一个大字符串并来回转换。优点:您可以存储 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;