Skip to content

Instantly share code, notes, and snippets.

@enue
Created December 23, 2016 00:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save enue/560c71d8aa4fa7a799c335bd69b8e75f to your computer and use it in GitHub Desktop.
Save enue/560c71d8aa4fa7a799c335bd69b8e75f to your computer and use it in GitHub Desktop.
[Unity]TiledMapEditorFile to ScriptableObject
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
// TODO : ObjectGroup対応
// TODO : エクスポートしていないTileSet対応
namespace TSKT
{
public class TiledMapFile : ScriptableObject
{
[System.Serializable]
public class PropertyParent
{
[System.Serializable]
public struct Property
{
[System.Xml.Serialization.XmlAttribute]
public string name;
[System.Xml.Serialization.XmlAttribute]
public string type;
[System.Xml.Serialization.XmlAttribute]
public string value;
}
[System.Xml.Serialization.XmlElement("property")]
public Property[] properties;
}
[System.Serializable]
[System.Xml.Serialization.XmlRoot("map")]
public class Map
{
[System.Serializable]
public struct TileSet
{
[System.Xml.Serialization.XmlAttribute("firstgid")]
public int firstGid;
[System.Xml.Serialization.XmlAttribute]
public string source;
}
[System.Serializable]
public class Layer
{
[System.Serializable]
public struct Data
{
public int[] values;
#if UNITY_EDITOR
[System.Xml.Serialization.XmlAttribute]
public string encoding;
[System.Xml.Serialization.XmlText]
public string value;
public void OnDeserialized()
{
var ids = new List<int>();
if (encoding == "csv")
{
ids = value.Split(',').Select(_ => System.Convert.ToInt32(_)).ToList();
}
else if (encoding == "base64")
{
var bytes = System.Convert.FromBase64String(value);
for (int i = 0; i < bytes.Length / 4; ++i)
{
var index = i * 4;
var id = bytes[index]
+ (bytes[index + 1] << 8)
+ (bytes[index + 2] << 16)
+ (bytes[index + 3] << 24);
ids.Add(id);
}
}
else
{
UnityEngine.Assertions.Assert.IsTrue(false, "not support encoding " + encoding);
}
values = ids.ToArray();
}
#endif
}
[System.Xml.Serialization.XmlAttribute]
public string name;
[System.Xml.Serialization.XmlAttribute]
public int width;
[System.Xml.Serialization.XmlAttribute]
public int height;
[System.Xml.Serialization.XmlElement("properties")]
public PropertyParent propertyParent;
[System.Xml.Serialization.XmlElement]
public Data data;
}
[System.Serializable]
public class ObjectGroup
{
[System.Serializable]
public class Object
{
[System.Serializable]
public class Polygon
{
[System.Xml.Serialization.XmlAttribute]
public string points;
}
[System.Serializable]
public class Polyline
{
[System.Xml.Serialization.XmlAttribute]
public string points;
}
[System.Serializable]
public class Ellipse
{
}
[System.Xml.Serialization.XmlAttribute]
public string name;
[System.Xml.Serialization.XmlAttribute]
public string type;
[System.Xml.Serialization.XmlAttribute]
public int x;
[System.Xml.Serialization.XmlAttribute]
public int y;
[System.Xml.Serialization.XmlAttribute]
public int width;
[System.Xml.Serialization.XmlAttribute]
public int height;
[System.Xml.Serialization.XmlAttribute]
public int gid;
[System.Xml.Serialization.XmlElement]
public PropertyParent properties;
[System.Xml.Serialization.XmlElement]
public Ellipse ellipse;
[System.Xml.Serialization.XmlElement]
public Polygon polygon;
[System.Xml.Serialization.XmlElement]
public Polyline polyline;
}
[System.Xml.Serialization.XmlAttribute]
public string name;
[System.Xml.Serialization.XmlElement("object")]
public Object[] objects;
}
[System.Xml.Serialization.XmlAttribute]
public string version;
[System.Xml.Serialization.XmlAttribute]
public string orientation;
[System.Xml.Serialization.XmlAttribute("renderorder")]
public string renderOrder;
[System.Xml.Serialization.XmlAttribute]
public int width;
[System.Xml.Serialization.XmlAttribute]
public int height;
[System.Xml.Serialization.XmlAttribute("tileWidth")]
public int tileWidth;
[System.Xml.Serialization.XmlAttribute("tileheight")]
public int tileHeight;
[System.Xml.Serialization.XmlAttribute("nextobjectid")]
public int nextObjectId;
[System.Xml.Serialization.XmlElement("properties")]
public PropertyParent propertyParent;
[System.Xml.Serialization.XmlElement("tileset")]
public TileSet[] tileSets;
[System.Xml.Serialization.XmlElement("layer")]
public Layer[] layers;
[System.Xml.Serialization.XmlElement("objectgroup")]
public ObjectGroup[] objectGroups;
}
public Map map;
#if UNITY_EDITOR
[SerializeField]
TextAsset xml;
public void Build()
{
var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Map));
var reader = new System.IO.StringReader(xml.text);
map = (Map)serializer.Deserialize(reader);
if (map.layers != null)
{
foreach (var layer in map.layers)
{
layer.data.OnDeserialized();
}
}
UnityEditor.EditorUtility.SetDirty(this);
}
#endif
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment