Unityではシリアル化を使用してローカルゲームデータを保存

5635 ワード

Unityではシリアル化を使用してローカルゲームデータを保存
ゲームではプレイヤーのデータを保存する必要がある場合がよくありますが、簡単なデータであれば、unityはPlayerPrefsクラスという非常に便利なデータ格納方法を提供しています.しかし、このように簡単なデータを保存するのはいいですが、複雑で大量のデータを保存するのは面倒で、通常XmlやJsonなどを選ぶかもしれませんが、ここではもう一つの便利な保存方法を紹介します.シーケンス化(Serialize)でプレイヤーのデータを保存するのは、xmlよりもコードが簡単だと思います.
例:例えば、今は三消ゲームをしています.ゲームはプレイヤーのデータを保存する必要があります.音効、音楽のスイッチ、生命値、金貨の数、すでに達成した関門、各関門で得た星の数と点数などが含まれています.今、これらのデータは本地に保存されていると仮定します.通常、私はまずプレイヤークラスを書いて、これらのデータを定義します.
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

//             
[System.Serializable]
public struct PlayerLevelRecord
{
    public int starCount;///
    public int playerScore;///
}

//     
[System.Serializable]
public class PlayerData
{ 
    //    
    public bool isMusicOn=true;///
    public bool isSoundOn=true;///

    //    
    public int life=5;///
    public int reachedLevel=1;///
    public List list_levelScore=new List();///

    //    
    public PlayerData()
    {
        PlayerLevelRecord record = new PlayerLevelRecord();
        record.starCount = 0;
        record.playerScore = 0;
        list_levelScore.Add(record);
    }
}

簡単なクラスとデータを定義したら、データの保存と読み取りです.
public class PlayerDataOperator : MonoBehaviour 
{
    public PlayerData playerData;///

    private string path;///

    // Use this for initialization
    void Awake () {
        //        ,    ,        
        SetPath();        
    }

    //       
    public PlayerData LoadPlayerData()
    {
        //        ,     
        if (File.Exists(path))
        {
            //    
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(path, FileMode.Open);
            playerData = (PlayerData)bf.Deserialize(file);
            file.Close();
        }
        //      , new   PlayerData
        else
        {
            playerData = new PlayerData();
        }

        return playerData;
    }

    //       
    public void SavePlayerData()
    {  
        //          
        BinaryFormatter bf = new BinaryFormatter();
        if (File.Exists(path))
        {
            File.Delete(path);
        }
        FileStream file = File.Create(path);      
        bf.Serialize(file, playerData);
        file.Close();       

    }

    //       ,       Application.persistentDataPath             
    void SetPath()
    {
        //    
        if (Application.platform==RuntimePlatform.Android)
        {
            path = Application.persistentDataPath + "/playerData.gd";
        }
        //windows   
        else if (Application.platform==RuntimePlatform.WindowsEditor)
        {
            path = Application.streamingAssetsPath + "/playerData.gd";
        }
    }
}

多くのコードが書かれていますが、実際には真のコアの保存と読み取りのコードはそれぞれ4-5行で、非常に簡単です.
特に、Unityのシーケンス化がサポートされていないデータが保存されている場合は、Dictionaryコンテナ、2次元配列など、保存できない可能性がありますが、他の方法で解決する必要があります.
上に何か間違いがあったら、大胆に指摘してください.