PlayerPrefs存储Vector3等结构数据



孙广东   2016.3.31

之前有网友询问这个问题, 当时我只是 提供了一个思路, 使用json序列化、反序列化。

 

下面就写出两种(都是只能变成字符串)

1json的序列化、反序列化方式

JsonFx.Json.JsonReader.Deserialize(data);

JsonFx.Json.JsonWriter.Serialize(classObject);

 

使用了插件: JsonFx.dll

下面是使用的一个案例

 

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

 

public class DataManager : MonoBehaviour

{

 

//sets the different kind of data into the player prefs...

 

//sets the coins data(position and rotation)...

public void setCoinsData(GameObject coins)

{

int coinCounter = 0;

for (int i = 0; i < coins.transform.childCount; i++)

{

coinCounter++;

string key = coins.name + "" + coinCounter;

//Coins Tag,Position,Rotation are passed in the Constructor.

CoinsData coinData = new CoinsData(key, coins.transform.GetChild(i).position, coins.transform.GetChild(i).rotation);

//String data stores data

string data = JsonFx.Json.JsonWriter.Serialize(coinData);

// Finally storing my Data i.e parsed from jason parser in Player Prefs

PlayerPrefs.SetString(coins.tag + "" + coinCounter, data);

 

}

}

 

//gets the activated gold coins data(position and rotation)...

public GameObject getCoinsData()

{

GameObject coins = GameObject.FindGameObjectWithTag("Coin");

for (int i = 0; i < coins.transform.childCount; i++) { if (coinCounter > 0)

{

string data = PlayerPrefs.GetString(coins.tag + "" + coinCounter);

// Storing Vector3 Data in Jason.

CoinsData coinData = JsonFx.Json.JsonReader.Deserialize(data);

string key = coins.name + "" + coinCounter;

coinData.coinPositionData = coinData.data [key];

// Get Coin data.

coins.transform.GetChild(i).position = new Vector3(coinData.coinPositionData.position.x, coinData.coinPositionData.position.y, coinData.coinPositionData.position.z);

coins.transform.GetChild(i).rotation = new Quaternion(coinData.coinPositionData.rotation.x, coinData.coinPositionData.rotation.y, coinData.coinPositionData.rotation.z, coinData.coinPositionData.rotation.w);

coins.transform.GetChild(i).gameObject.SetActive(true);

coinCounter--;

} else

{

coins.transform.GetChild(i).gameObject.SetActive(false);

}

}

return coins;

}

class CoinsData

{

public PositionData coinPositionData = new PositionData();

// Storing Coin Data in Dictonary.

public Dictionary data = new Dictionary();

public CoinsData(string key, Vector3 coinPosition, Quaternion coinRotation)

{

// Get popstion of coin at run time

coinPositionData.position = new Cords(coinPosition.x, coinPosition.y, coinPosition.z);

coinPositionData.rotation = new Rotation(coinRotation.x, coinRotation.y, coinRotation.z, coinRotation.w);

// Add data to dictionary

if (key != null)

data.Add(key, coinPositionData);

}

// Default Constructer is needed when u r using Jason Parsing.

public CoinsData()

{

}

}

//Get Coins Postion

class PositionData

{

public Cords position;

public Rotation rotation;

}

// Get Coins Cords

class Cords

{

public float x, y, z;

public Cords(float x, float y, float z)

{

this.x = x;

this.y = y;

this.z = z;

}

public Cords()

{

}

}

// Get Coin Rotation

class Rotation

{

public float x, y, z, w;

public Rotation(float x, float y, float z, float w)

{

this.x = x;

this.y = y;

this.z = z;

this.w = w;

}

public Rotation()

{

}

}

}


 

注: 当然了可以使用  Unity5.2/3之后添加 JsonUtility  类, 更加方便!!!

 

 

2、自己写一个 一个形式

比如我们在存储一个数组  ,就是把每个元素 |”连接成一个字符串,

读取获取的时候在  根据 |”截取每个元素就行了 。原理就是这样。

http://wiki.unity3d.com/index.php/ArrayPrefs2

 

        尽管这些功能使它易于保存数组,PlayerPrefs 更适合少量的数据,像本地存储少于十个列表等。 PlayerPrefsX 并不打算把 PlayerPrefs 变成一个数据库系统。如果你有大量的数据,您应改用标准磁盘 IO 功能。

 

        PlayerPrefsX 是基于 PlayerPrefs.SetString,保存为一个数组(具体而言,一个字符数组)。所以,保存浮点数和整数的数组时,每个数字转换为 4 个字节,并存储到字节数组中。总字节数组转换成 base64,然后另存为一个字符串。当保存一个布尔值数组,每个布尔值被转换为一个字节数组,它再次转换为 b

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值