使用する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をなくせばできます。
以上です。