読者です 読者をやめる 読者になる 読者になる

自分用めも

初心者ちっくなプログラムネタを中心に、自分用の覚え書きをメモっていくための場所です。

Unityでセーブ/ロード処理

Unity

Unity 5.3.0f4 (64-bit)。
AndroidWebGLで出力したいと思っています。



軽く調べた限りでは、二通りの方法がありそう
(後者使う意味はあんまりないと思います)

1. PlayerPrefsクラスを使う (UnityEngine)

Unityマニュアル
http://docs.unity3d.com/ja/current/ScriptReference/PlayerPrefs.html

  • セーブ/ロード機能向けに提供されているクラス
  • いわゆるKey-Value型
  • 型が限定されている。float、int、stringのみ。
  • バイナリデータで保存される
  • WebPlayerで使用する場合、1Mのサイズ制限あり(1M=1,048,576Byte)
using UnityEngine;
using System;

public class Test : MonoBehaviour
{
    public string SaveData { get; set; }
    private string SaveKey = "hoge";

    void Start()
    {
        // ロード
        SaveData = PlayerPrefs.GetString(SaveKey, "未定義の場合の初期値");
        Debug.Log(SaveData);
    }

    public void Save(string Data)
    {
        // セーブ
        SaveData = Data;
        PlayerPrefs.SetString(SaveKey, SaveData);
        PlayerPrefs.Save();
    }
}

2. Fileクラスを使う (System.IO)

.NET Framework クラス ライブラリ
https://msdn.microsoft.com/ja-jp/library/system.io(v=vs.110).aspx

  • 保存可能容量が多そう
    (1MあるならPlayerPrefsでいいか、と思ったらこっち調べるのめんどくさくなってしまった…。そのうち追記)
  • そのまま保存される

例えばオリジナルステージを作って出力してユーザー同士で共有するとか
そういう使い方に向いてるのかも

using UnityEngine;
using System.Collections;
using System;
using System.IO;

public class Test : MonoBehaviour
{
    public string SaveData { get; set; }
    private string FileName = "hoge.dat";

    void Start()
    {
        if (File.Exists(Application.dataPath + FileName))
        {
            using (StreamReader sr = File.OpenText(Application.dataPath + FileName))
            {
                // ロード
                SaveData = sr.ReadToEnd();
                Debug.Log(SaveData);
            }
        }
    }

    public void Save(string Data)
    {
        // セーブ
        SaveData = Data;
        using (StreamWriter sw = new StreamWriter(Application.dataPath + FileName, false))
        {
            sw.WriteLine(Data);
            sw.Flush();
            sw.Close();
        }
    }
}

参考
UnityでCSVファイルを書き出ししたときのメモ - Qiita