【Unity】PlayerPrefsを使ったデータの保存、読み出し

PlayerPrefs は Unity でデータを簡単に保存し、読み出すための便利なツールです。PlayerPrefs を使用すると、プレイヤーの設定やゲームの状態などを簡単に保存し、アプリケーションを再起動した後でもこれらの情報を取得することができます。ここでは、スコア、プレイヤー名、音量レベルといったデータの保存と読み出しのシンプルな例を示します。

値型の場合

スコアの保存と読み出し

スコアの保存:

public static void SaveScore(int score)
{
    PlayerPrefs.SetInt("PlayerScore", score); // スコアを "PlayerScore" というキーで保存しています
    PlayerPrefs.Save();  // データを確実に保存するために呼び出す
}

スコアの読み出し:

public static int LoadScore()
{
    return PlayerPrefs.GetInt("PlayerScore", 0);  // デフォルト値として 0 を指定
}

プレイヤー名の保存と読み出し

プレイヤー名の保存:

public static void SavePlayerName(string playerName)
{
    PlayerPrefs.SetString("PlayerName", playerName);
    PlayerPrefs.Save();  // データを確実に保存するために呼び出す
}

プレイヤー名の読み出し:

public static string LoadPlayerName()
{
    return PlayerPrefs.GetString("PlayerName", "DefaultPlayer");  // デフォルト名を指定
}

音量レベルの保存と読み出し

音量レベルの保存:

public static void SaveVolume(float volume)
{
    PlayerPrefs.SetFloat("GameVolume", volume);
    PlayerPrefs.Save();  // データを確実に保存するために呼び出す
}

音量レベルの読み出し:

public static float LoadVolume()
{
    return PlayerPrefs.GetFloat("GameVolume", 1.0f);  // デフォルト値として最大音量を指定
}

これらのコードスニペットは、PlayerPrefsを用いた基本的なデータの保存と読み出し方法を示しています。PlayerPrefsは非常に便利ですが、セキュリティが重要なデータには適していないことに注意してください。セキュリティが必要なデータの保存には、暗号化や他のデータストレージソリューションを検討することが推奨されます。

クラスから生成したインスタンスの場合

UnityでインスタンスをJSON形式にシリアライズして保存し、後でそれを読み出してデシリアライズする方法についてのサンプルコードを提供します。これは、より複雑なデータ構造をPlayerPrefsを使って保存・読み込みする場合に便利です。

まず、保存するデータのクラスを定義します。例として、PlayerDataクラスにプレイヤーの名前とスコアを含めます。

データクラスの定義

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int score;

    public PlayerData(string playerName, int score)
    {
        this.playerName = playerName;
        this.score = score;
    }
}

データの保存

インスタンスをJSON形式にシリアライズしてPlayerPrefsに保存するメソッドを定義します。

public static void SavePlayerData(PlayerData data)
{
    string jsonData = JsonUtility.ToJson(data);
    PlayerPrefs.SetString("PlayerData", jsonData);
    PlayerPrefs.Save();
}

データの読み込み

保存されたJSONデータを読み出して、PlayerDataインスタンスにデシリアライズするメソッドを定義します。

public static PlayerData LoadPlayerData()
{
    string jsonData = PlayerPrefs.GetString("PlayerData", "{}");
    return JsonUtility.FromJson<PlayerData>(jsonData);
}

使用例

プレイヤーデータを保存し、その後で読み出す使用例です。

public class GameManager : MonoBehaviour
{
    void Start()
    {
        // 新しいプレイヤーデータを作成して保存
        PlayerData player = new PlayerData("Alice", 5000);
        SavePlayerData(player);

        // データを読み出してログに表示
        PlayerData loadedPlayer = LoadPlayerData();
        Debug.Log("Loaded Player Name: " + loadedPlayer.playerName);
        Debug.Log("Loaded Score: " + loadedPlayer.score);
    }
}

このサンプルでは、PlayerDataクラスのインスタンスを作成し、それをJSONにシリアライズしてPlayerPrefsに保存しています。その後、保存されたデータを読み出し、デシリアライズしています。この方法を使うことで、複数のデータフィールドを含む複雑なオブジェクトも簡単に保存・読み出しが可能になります。

作成されるJSONファイル

上記の例で使用したPlayerDataクラスのインスタンスをJSONにシリアライズした場合、生成されるJSON文字列は以下のようになります。この例では、PlayerDataにプレイヤー名 “Alice" とスコア 5000 を設定しています。

生成されるJSONファイルの内容

JSONのフォーマットは次のようになります:

{
  "playerName": "Alice",
  "score": 5000
}

このJSONは、PlayerData オブジェクトの公開されているプロパティ(この場合は playerNamescore)をキーとして持ち、それぞれの値が保存されます。JsonUtility を使用してシリアライズすると、Unityはこのようなシンプルなキーバリュー形式のJSONを生成します。

JSONシリアライズのプロセス

上記のJSONデータを生成するために、以下のコードを使用します。

PlayerData player = new PlayerData("Alice", 5000);
string jsonData = JsonUtility.ToJson(player);

この jsonData 変数には、上記のJSON文字列が含まれており、これを PlayerPrefs に保存することができます。実際に保存する際には以下のコマンドが実行されます:

PlayerPrefs.SetString("PlayerData", jsonData);
PlayerPrefs.Save();

そして、後にこのJSONデータを読み出し、PlayerData オブジェクトにデシリアライズする場合は以下のようになります:

string loadedJsonData = PlayerPrefs.GetString("PlayerData", "{}");
PlayerData loadedPlayer = JsonUtility.FromJson<PlayerData>(loadedJsonData);

こうして、PlayerPrefs を使用して、アプリケーションのセッション間で簡単に複雑なデータオブジェクトを永続化し、再度アクセスすることが可能になります。

Unity

Posted by hidepon