Unityではシリアル化を使用してローカルゲームデータを保存
5635 ワード
Unityではシリアル化を使用してローカルゲームデータを保存
ゲームではプレイヤーのデータを保存する必要がある場合がよくありますが、簡単なデータであれば、unityはPlayerPrefsクラスという非常に便利なデータ格納方法を提供しています.しかし、このように簡単なデータを保存するのはいいですが、複雑で大量のデータを保存するのは面倒で、通常XmlやJsonなどを選ぶかもしれませんが、ここではもう一つの便利な保存方法を紹介します.シーケンス化(Serialize)でプレイヤーのデータを保存するのは、xmlよりもコードが簡単だと思います.
例:例えば、今は三消ゲームをしています.ゲームはプレイヤーのデータを保存する必要があります.音効、音楽のスイッチ、生命値、金貨の数、すでに達成した関門、各関門で得た星の数と点数などが含まれています.今、これらのデータは本地に保存されていると仮定します.通常、私はまずプレイヤークラスを書いて、これらのデータを定義します.
簡単なクラスとデータを定義したら、データの保存と読み取りです.
多くのコードが書かれていますが、実際には真のコアの保存と読み取りのコードはそれぞれ4-5行で、非常に簡単です.
特に、Unityのシーケンス化がサポートされていないデータが保存されている場合は、Dictionaryコンテナ、2次元配列など、保存できない可能性がありますが、他の方法で解決する必要があります.
上に何か間違いがあったら、大胆に指摘してください.
ゲームではプレイヤーのデータを保存する必要がある場合がよくありますが、簡単なデータであれば、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次元配列など、保存できない可能性がありますが、他の方法で解決する必要があります.
上に何か間違いがあったら、大胆に指摘してください.