序列化是将数据结构或对象转换为可存储或传输格式的过程。在Unity中,序列化通常用于将脚本组件中的变量保存到场景或预制件中,或者将数据存储在文件中以便稍后读取。Unity提供了几种序列化方式,本文将介绍其中常见的几种。
在Unity中,可以使用SerializeField属性将一个字段标记为可序列化的。例如:
public class Player : MonoBehaviour
{
[SerializeField]
private string playerName;
[SerializeField]
private int playerLevel;
}
在这个例子中,playerName和playerLevel字段都被标记为可序列化的,因此它们的值可以在场景或预制件中保存和加载。值得注意的是,SerializeField只能用于字段,不能用于属性。
Json序列化是一种将对象转换为Json格式的序列化方式。Unity内置了JsonUtility类来进行Json序列化。例如:
[Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
}
public class GameController : MonoBehaviour
{
private PlayerData playerData = new PlayerData();
private void SavePlayerData()
{
string json = JsonUtility.ToJson(playerData);
// 将json字符串保存到文件中
}
private void LoadPlayerData()
{
// 从文件中读取json字符串
playerData = JsonUtility.FromJson(json);
}
}
在这个例子中,PlayerData类被标记为可序列化的,因此JsonUtility可以将它转换为Json格式的字符串。在保存和加载数据时,可以使用JsonUtility的ToJson和FromJson方法。
Binary序列化是将对象转换为二进制格式的序列化方式。Unity内置了BinaryFormatter类来进行Binary序列化。例如:
[Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
}
public class GameController : MonoBehaviour
{
private PlayerData playerData = new PlayerData();
private void SavePlayerData()
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, playerData);
// 将stream中的数据保存到文件中
}
private void LoadPlayerData()
{
// 从文件中读取二进制数据到stream中
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream(data);
playerData = (PlayerData)formatter.Deserialize(stream);
}
}
在这个例子中,可以使用BinaryFormatter将PlayerData对象转换为二进制格式,并将数据保存到内存流中。在保存和加载数据时,可以使用Serialize和Deserialize方法。
下面是一些常见的代码例子,演示了如何使用Unity中的序列化:
public class Player : MonoBehaviour
{
[SerializeField]
private string playerName;
[SerializeField]
private int playerLevel;
}
在这个例子中,playerName和playerLevel字段都被标记为可序列化的。
[Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
}
public class GameController : MonoBehaviour
{
private PlayerData playerData = new PlayerData();
private void SavePlayerData()
{
string json = JsonUtility.ToJson(playerData);
// 将json字符串保存到文件中
}
private void LoadPlayerData()
{
// 从文件中读取json字符串
playerData = JsonUtility.FromJson(json);
}
}
在这个例子中,JsonUtility用于将PlayerData对象转换为Json格式的字符串,并将字符串保存到文件中。在加载数据时,可以使用JsonUtility的FromJson方法将字符串转换回PlayerData对象。
[Serializable]
public class PlayerData
{
public string playerName;
public int playerLevel;
}
public class GameController : MonoBehaviour
{
private PlayerData playerData = new PlayerData();
private void SavePlayerData()
{
BinaryFormatter formatter = newBinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, playerData);
// 将stream中的数据保存到文件中
}
private void LoadPlayerData()
{
// 从文件中读取二进制数据到stream中
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream(data);
playerData = (PlayerData)formatter.Deserialize(stream);
}
在这个例子中,BinaryFormatter用于将PlayerData对象转换为二进制格式,并将二进制数据保存到内存流中。在加载数据时,可以使用BinaryFormatter的Deserialize方法将二进制数据转换回PlayerData对象。