Created
December 23, 2016 00:37
-
-
Save enue/560c71d8aa4fa7a799c335bd69b8e75f to your computer and use it in GitHub Desktop.
[Unity]TiledMapEditorFile to ScriptableObject
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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