LoginSignup
20
17

More than 5 years have passed since last update.

Unity 手軽にJson読み書きできる

Last updated at Posted at 2015-03-10

使用するJsonライブラリー

LitJSON

  • どんなものか?
    • "LitJSON"は、JSON読み書き用のライブラリで、ライセンスはPublicDomainとなっています。エンコード・デコードなどの必要な機能に加えて、Exceptionが用意されていたり、シリアライズ・デシリアライズができるので、十分な機能は提供されていると思ってよいと思います。
  • サイト

書き込み方法

  • キャラクターの基本データを書き出すことをやってみます。
  • 1体だけではなく複数のデータを扱ってみたいと思います。
CharacterDataToJson.cs
/// <summary>
/// Vector3のプロパティしか入っていない構造体
/// </summary>
public struct Vec3
{
    public Vec3(float x, float y, float z)
        : this()
    {
        X = x;
        Y = y;
        Z = z;
    }

    public float X { get; set; }
    public float Y { get; set; }
    public float Z { get; set; }
};


public struct CharacterData
{
    public CharacterData(string name,int level, Vector3 pos, Vector3 scale)
        : this()
    {
        Level = level;
        Name = name;
        Pos = new Vec3(pos.x, pos.y, pos.z);
        Scale = new Vec3(scale.x, scale.y, scale.z);
    }

    public string Name { get; set; }
    public int Level { get; set; }
    public Vec3 Scale { get; set; }
    public Vec3 Pos { get; set; }
};

public class CharacterDataToJson : MonoBehaviour
{
    List<CharacterData> DataList = new List<CharacterData>();

    /// <summary>
    /// 1体のキャラクターデータを書き出す。
    /// </summary>
    public void Write(CharacterData saveCharacterData)
    {
        DataList.Add(saveCharacterData);
    }

    /// <summary>
    /// ファイルに書き出す
    /// </summary>
    public void FileWrite(string name)
    {
        // データをJsonの文字列に変換する
        string json = LitJson.JsonMapper.ToJson(DataList);

        // 保存するフォルダー
        var path = Application.persistentDataPath + "/Database/" ;

        // フォルダーがない場合は作成する
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        File.WriteAllText(path + name + ".json", json);
        DataList.Clear();
    }

}
  • 親オブジェクトで子オブジェクトのデータをJsonに書き出せば書き出しはOKです。

読み込む方法

  • 親オブジェクトで書き出したJsonのファイルを読み込むことをします。
CharacterManager.cs


/// 親オブジェクトのクラス
public class CharacterManager : MonoBehaviour
{
    [SerializeField]
    GameObject ChildrenPrefab = null;

    void Start()
    {    
        ChildrensLoading();
    }

    /// <summary>
    /// 子オブジェクト達を読み込む
    /// </summary>
    void ChildrensLoading()
    { 
        var folderpath = Application.persistentDataPath + "/Database/" ;
        var filePath = folderpath + name + ".json";

        if (!File.Exists(filePath)) return;

        var jsonText = File.ReadAllText(filePath);
        if (string.IsNullOrEmpty(jsonText)) return;

        /// Json文字列をCharacterDataの配列に変換する
        var json = LitJson.JsonMapper.ToObject<CharacterData[]>(jsonText);

        foreach(var chara in json)
        {
            ChildrenCreate(chara);
        }
    }

    /// <summary>
    /// 子オブジェクトを生成
    /// </summary>
    void ChildrenCreate(CharacterData chara)
    {
        var clone = (GameObject)Instantiate(ChildrenPrefab, Vector3.zero, Quaternion.identity);
        clone.name = chara.Name;
        clone.transform.parent = transform;
        clone.transform.position = new Vector3(chara.Pos.X, chara.Pos.Y, chara.Pos.Z);
        clone.transform.lossyScale.Scale(new Vector3(chara.Pos.X, chara.Pos.Y, chara.Pos.Z));
    }



}

LitJsonだけで簡単に読み書きができます。
1体だけならListをなくせばできます。
以上です。

20
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
17