menu 首页 标签 归档 视频 关于
Unity-单机游戏的存档与读档

一言加载中...

1.PlayerPrefs;

存储数据

PlayerPrefs.SetString(“Name”,”Tony”); //设置String

PlayerPrefs.SetInt(“Age”,11); //设置Int

PlayerPrefs.SetFloat(“Score”,123.5f); //设置Float

PlayerPrefs.Save(); //保存数据

读取数据

PlayerPrefs.GetString(“Name”); //获得Name

Playerf.GetInt(“Age”); //获得Age

PlayerPrefs.GetFloat(“Score”); //获得Float

PlayerPrefs.HasKey(“Score”); //包含“Score”键值

2.序列化与反序列化

Serialization(序列化) 将对象转化为字节流;

Deseriallzation(反序列化) 将字节流转化为对象;

二进制

序列化:新建或打开一个二进制文件,通过二进制格式器将对象写入二进制文件;

反序列化:打开待反序列化的文件,通过二进制格式器将文件解析成对象;

//简单,可读性差;

二进制保存

Save save = CreateSaveObject();
//创建二进制格式化文件
BinaryFormatter bf = new BinaryFormatter();
//创建爱你文件流
FileStream fs = File.Create(Application.dataPath + "/StreamingFile" + "/ByBin.dat");
//序列化
bf.Serialize(fs, save);
fs.Close();
if(File.Exists(Application.dataPath+ "/StreamingFile" + "/ByBin.dat"))
{
    Debug.Log("二进制保存成功");
}

二进制读取

stringfilePath= Application.dataPath + "/StreamingFile" + "/ByBin.dat";
if(File.Exists(filePath))
{
    BinaryFormatter bf = new BinaryFormatter();
    FileStream fs =File.Open(filePath,FileMode.Open);
    //反序列化
    Save save =(Save)bf.Deserialize(fs);
    fs.Close();
    SetGame(save);
}
else
{
    Debug.Log("找不到游戏档案!");
}

XML

可读性强,文件大,冗余信息多;

Using System.Xml;

序列化

Save save = CreateSaveObject();
string path =Application.dataPath + "/StreamingFile" + "/ByXml.xml";
XmlDocument xmlDoc = new XmlDocument();
XmlElement root = xmlDoc.CreateElement("body");

root.SetAttribute("name", "GameData");
XmlElement animal, pos, type;

for(int i=0;i<save.livingTarget.Count;i++)
&#123;
    animal = xmlDoc.CreateElement("animal");
    pos = xmlDoc.CreateElement("pos");
    pos.InnerText =save.livingTarget[i].ToString();
    type = xmlDoc.CreateElement("type");
    type.InnerText =save.livingType[i].ToString();

    animal.AppendChild(pos);
    animal.AppendChild(type);

    root.AppendChild(animal);

&#125;

XmlElement score = xmlDoc.CreateElement("score");
score.InnerText = save.Score.ToString();
root.AppendChild(score);

XmlElement shootNum = xmlDoc.CreateElement("shootNum");
shootNum.InnerText = save.ShootNumber.ToString();

root.AppendChild(shootNum);

xmlDoc.AppendChild(root);

//保存文件
xmlDoc.Save(path);
if(File.Exists(path))
&#123;
    Debug.Log("Xml保存成功");
&#125;

反序列化

string path =Application.dataPath + "/StreamingFile" + "/ByXml.xml";
if(File.Exists(path))
&#123;
    Save save = new Save();
    //加载XML文档
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(path);

    XmlNodeList list =xmlDoc.GetElementsByTagName("animal");

    if(list.Count!=0)
    &#123;
        foreach(XmlNode node in list)
        &#123;
            XmlNode targetPos =node.ChildNodes[0];
            //位置
            int index = int.Parse(targetPos.InnerText);
            //把得到的值存储到save中
            save.livingTarget.Add(index);

            XmlNode targetType =node.ChildNodes[1];
            //类型
            int type = int.Parse(targetType.InnerText);
            save.livingType.Add(type);
        &#125;
    &#125;

//射击数
XmlNodeList shootNum =xmlDoc.GetElementsByTagName("shootNum");
int targetShootNum = int.Parse(shootNum[0].InnerText);
save.ShootNumber = targetShootNum;
//分数
XmlNodeList score =xmlDoc.GetElementsByTagName("score");
int targetScore = int.Parse(score[0].InnerText);
save.Score = targetScore;

//加载动物
SetGame(save);
&#125;

Json

//格式简单,易于读写,但是不够直观,可读性比XML差;

1.引用LitJson.dll

Using LitJson;

序列化

Save save = CreateSaveObject();
string path =Application.dataPath + "/StreamingFile" + "/byJson.json";
//序列化
stringstr_json = JsonMapper.ToJson(save);
//写入文件
StreamWriter sw = new StreamWriter(path);
sw.Write(str_json);
sw.Close();
if(File.Exists(path))
&#123;
    Debug.Log("Json存储完成");
&#125;

反序列化

string path=Application.dataPath + "/StreamingFile" + "/byJson.json";
if(File.Exists(path))
&#123;
    StreamReader sr = new StreamReader(path);
    string str_json = sr.ReadToEnd();
    sr.Close();
    //反序列化
    Save save =JsonMapper.ToObject<Save>(str_json);
    SetGame(save);
&#125;

用到的方法:

private Save CreateSaveObject()
&#123;
    Save save = new Save();
    foreach(GameObjecttargetGO intargetGOs)
    &#123;
        TargetManager targetManager =targetGO.GetComponent<TargetManager>();
        if(targetManager.activeMonster!=null)
        &#123;
            save.livingTarget.Add(targetManager.TargetPositionIndex);
            int type =targetManager.activeMonster.GetComponent<MonsterManager>().MonstorType;
            save.livingType.Add(type);
        &#125;
    &#125;
    save.ShootNumber = UIManager._instance.shootNum;
    save.Score = UIManager._instance.score;
    return save;
&#125;


//可序列化的
[System.Serializable]

public class Save&#123;
    publicList<int>livingTarget = newList<int>();
    publicList<int>livingType = newList<int>();
    publicint ShootNumber = 0;
    publicint Score = 0;
&#125;

//2018.4.6

//TonyChen

写博客不易,请我喝杯咖啡?

评论

arrow_upward