孙广东 2016.3.31
之前有网友询问这个问题, 当时我只是 提供了一个思路, 使用json序列化、反序列化。
下面就写出两种(都是只能变成字符串)
1、json的序列化、反序列化方式
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