はじめに
みなさんUnityのレベルデータはどんな感じで扱っていますか?
最近、ちょっとした挑戦でUnity上でレベルデータを読み書きし、そのレベルデータを見やすくするために、エディター拡張したりGoogle Sheetsに保存したりしています。
この辺もっといい方法があればいいですね。
今日はJsonFxを利用してUnity上でJSONの読み書きについて書いてみます。
ちょっと複雑なJSONデータの扱いを例と共に書きます!
眠いのでちょっと適当なところがあるかも(?)あったら指摘してください!
環境構成
Unity5.0.2f1(試してないが、Unity4もおそらく動くと思う)
Mac 10.10.3(試してないが、Windowsもおそらく動くと思う)
DTO(Data Transfer Object)
DTOはシリアライズする際にデフォルトコンストラクタがないとシリアライズできませんと怒られるので必ず入れてください!
Levelデータ全体DTO
LevelDataList.cs
using System.Collections.Generic;
public class LevelDataList
{
public List<BlockDto> BlockData { get; set; }
public List<PowerUpItemDto> PowerUpItemData { get; set; }
}
基底オブジェクトDTO(これを継承してアイテムとかブロックとかのDTOを作る)
ObjectBaseDto.cs
public class ObjectBaseDto
{
public ObjectBaseDto ()
{
}
public ObjectBaseDto (PositionDto _Position, float _SpawnTime)
{
Position = _Position;
SpawnTime = _SpawnTime;
}
public PositionDto Position { get; set; }
public float SpawnTime { get; set; }
}
オブジェクトの位置情報DTO
PositionDto.cs
public class PositionDto
{
public PositionDto ()
{
}
public PositionDto (float _X, float _Y)
{
X = _X;
Y = _Y;
}
public float X { get; set; }
public float Y { get; set; }
}
ブロックDTO(ObjectBaseDtoを継承)
BlockDto.cs
public class BlockDto : ObjectBaseDto
{
public BlockDto ()
{
}
public BlockDto (PositionDto _Position, float _SpawnTime, int _Type) : base (_Position, _SpawnTime)
{
Type = _Type;
}
public int Type { get; set; }
}
パワーアップアイアテムDTO(ObjectBaseDtoを継承)
PowerUpItemDto.cs
public class PowerUpItemDto : ObjectBaseDto
{
public PowerUpItemDto ()
{
}
public PowerUpItemDto (PositionDto _Position, float _SpawnTime, int _Type) : base (_Position, _SpawnTime)
{
Type = _Type;
}
public int Type { get; set; }
}
JSONの読み込み
LEVEL.jsonを読み込む(拡張子がないことに注意)
パスは[プロジェクトホーム]/Assets/Resources/Jsonです。
var levelData = (Resources.Load ("Json/LEVEL") as TextAsset).text;
Debug.Log ("levelData : " + levelData);
_levelDataList = JsonFx.Json.JsonReader.Deserialize<LevelDataList> (levelData);
JSONの書き込み
// 上のレベル全体データからブロックデータのみ抽出
List<Transform> _blockList = levelDataList.BlockData;
// レベルデータ全体DTO
LevelDataList _levelDataList = new LevelDataList ();
// ブロックデータDTO
List<BlockDto> _blockDataList = new List<BlockDto> ();
// ループしながらデータを代入
for (int i=0; i<10; i++)
{
PositionDto p = new PositionDto (blockTran.position.x, blockTran.position.y);
float s = Random.Range (1.0f, 3.0f);
int t = Random.Range (1, 2);
BlockDto b = new BlockDto (p, s, t);
_blockDataList.Add (b);
}
_levelDataList.BlockData = _blockDataList;
// レベルをJSON化する
var levelDataListJson = JsonFx.Json.JsonWriter.Serialize (_levelDataList);
Debug.Log ("levelDataListJson : " + levelDataListJson);
// レベルデータ(JSON)を永久保存
File.WriteAllText (Application.dataPath + "/Resources/Json/levelDataTest.json", levelDataListJson);