PR

[Unity]PlayerPrefsにbool型、Object型を保存する方法

Unity

はじめに

ちょっとしたデータを保存したい時に便利なPlayerPref。

しかし対応している型が

  • int
  • float
  • string

の3つしかありません。

使っていく上で、bool型やoject型を保存したくなるので、備忘録として書いておきます。

環境

  • Unity 2020.1.7f1

実装

PlayerPrefsUtil.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class PlayerPrefsUtil
{
    public static bool GetBool(string key, bool defaultValue)
    {
        if (!PlayerPrefs.HasKey(key))
        {
            return defaultValue;
        }
        return GetBool(key);
    }

    public static bool GetBool(string key)
    {
        return PlayerPrefs.GetInt(key) != 0;
    }

    public static void SetBool(string key, bool value)
    {
        PlayerPrefs.SetInt(key, value ? 1 : 0);
    }

    public static T GetObject<T>(string key, T defaultValue)
    {
        if (!PlayerPrefs.HasKey(key))
        {
            return defaultValue;
        }
        return GetObject<T>(key);
    }

    public static T GetObject<T>(string key)
    {
        string json = PlayerPrefs.GetString(key, "{}");
        return JsonUtility.FromJson<T>(json);
    }

    public static void SetObject<T>(string key, T value)
    {
        string json = JsonUtility.ToJson(value);
        PlayerPrefs.SetString(key, json);
    }

}

使い方

PlayerPrefsと同じような使い方になるように作成しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        PlayerPrefsUtil.SetBool("bool_test", true);
        Debug.Log(PlayerPrefsUtil.GetBool("bool_test"));
        // True

        var saveData = new SaveData("test", 100);
        PlayerPrefsUtil.SetObject<SaveData>("obj_test", saveData);
        var obj = PlayerPrefsUtil.GetObject<SaveData>("obj_test");
        Debug.Log(obj.ToString());
        // name:test, score:100
    }

}

[System.Serializable]
public class SaveData
{
    public string name;
    public int score;

    public SaveData(string name, int score)
    {
        this.name = name;
        this.score = score;
    }

    public override string ToString()
    {
        return string.Format("name:{0}, score:{1}", this.name, this.score);
    }
}

まとめ

本当ならPlayerPrefsの拡張で作りたかったけど、できなかったので別メソッドで作成しました。

おすすめ参考書

コメント

タイトルとURLをコピーしました