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

# 使用するJsonライブラリー
## LitJSON
* どんなものか？
    * "LitJSON"は、JSON読み書き用のライブラリで、ライセンスはPublicDomainとなっています。エンコード・デコードなどの必要な機能に加えて、Exceptionが用意されていたり、シリアライズ・デシリアライズができるので、十分な機能は提供されていると思ってよいと思います。
* サイト
    * [LitJSON](http://lbv.github.io/litjson/) 


# 書き込み方法
* キャラクターの基本データを書き出すことをやってみます。
* 1体だけではなく複数のデータを扱ってみたいと思います。

```csharp: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のファイルを読み込むことをします。

```csharp: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をなくせばできます。
以上です。