Commit c70aa22f by Tim Reiter
parents 5ee91849 32aed244
*.csproj
*.sln
*.userprefs
/Assets/Resources/XmlItemsToExport.xml
/Library
/Temp
/Assembly-CSharp.csproj
/Assembly-CSharp-vs.csproj
/dyingIsMainstream.sln
/dyingIsMainstream.userprefs
/dyingIsMainstream-csharp.sln
<?xml version="1.0" encoding="Windows-1252"?>
<Levels xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Level>
<Item prefab="Player Two" x="-3.05" y="2.06" />
<Item prefab="Player One" x="-0.23" y="2.06" />
<Item prefab="Trap" x="-5.02" y="-0.57" rot="90" />
<Item prefab="ground" x="1.51" y="-0.8" scalex="58.39" />
<Item prefab="Turret" x="4.47" y="0.71" />
<Item prefab="PortableFire" x="4.04" y="-0.22" scalex="0.2" scaley="0.2" />
</Level>
</Levels>
\ No newline at end of file
......@@ -6,50 +6,50 @@ using System.IO;
[XmlRoot("Levels")]
public class DeserializedLevels
{
[XmlElement ("Developer")]
public Developer developer;
public class Developer
{
[XmlAttribute ("StartLevel")]
public string startLevel;
}
[XmlElement ("Level")]
public Level[] levels;
public class Level
{
[XmlElement("Item")]
public Item[] items;
}
public class PlayerStartPosition
{
[XmlAttribute("x")]
public string x;
[XmlAttribute("y")]
public string y;
}
public class Item
{
[XmlAttribute ("prefab")]
public string prefab;
[XmlAttribute ("x")]
public string x;
[XmlAttribute ("y")]
public string y;
[XmlAttribute ("rot")]
public string rot;
[XmlAttribute("scalex")]
public string scalex;
[XmlAttribute("scaley")]
public string scaley;
}
[XmlElement ("Developer")]
public Developer developer;
public class Developer
{
[XmlAttribute ("StartLevel")]
public string startLevel;
}
[XmlElement ("Level")]
public Level[] levels;
public class Level
{
[XmlElement("Item")]
public Item[] items;
}
public class PlayerStartPosition
{
[XmlAttribute("x")]
public string x;
[XmlAttribute("y")]
public string y;
}
public class Item
{
[XmlAttribute ("prefab")]
public string prefab;
[XmlAttribute ("x")]
public string x;
[XmlAttribute ("y")]
public string y;
[XmlAttribute ("rot")]
public string rot;
[XmlAttribute("scalex")]
public string scalex;
[XmlAttribute("scaley")]
public string scaley;
}
}
......@@ -7,42 +7,42 @@ using System.Xml;
using System.Linq;
public class DeserializedLevelsCrossChecker {
//Hallo Tim und Philipp. Die Datei kuckt nur ob irgendwas mit den Prefabs komisch ist.
// cross check /Resources/Prefabs and Levels.xml if there are any item prefabs that exist only in one but not the other
public void crossCheck ()
{
// create a list of /Resources/Prefabs for resources and Levels.Xml
List<string> resPrefabList = new List<string>();
List<string> xmlPrefabList = new List<string>();
// Get prefabs from Levels.xml
DeserializedLevels deserializedLevels = XmlIO.LoadXml<DeserializedLevels>("Levels");
foreach (DeserializedLevels.Level level in deserializedLevels.levels)
{
foreach (DeserializedLevels.Item item in level.items)
if (!xmlPrefabList.Contains(item.prefab))
xmlPrefabList.Add(item.prefab);
}
// Get prefabs from the /Resources/Prefabs folder
// get all child items in the /Resources/Prefabs folder
DirectoryInfo dir = new DirectoryInfo("Assets/Resources/Prefabs");
FileInfo[] fileInfos = dir.GetFiles("*.prefab");
fileInfos.Select(f => f.FullName).ToArray();
// Add each prefab's file name to prefabList and truncate the .prefab extension from the end
foreach (FileInfo fileInfo in fileInfos)
resPrefabList.Add (fileInfo.Name.Substring(0, fileInfo.Name.Length - ".prefab".Length));
// Cross checks
foreach (string prefab in xmlPrefabList.Except(resPrefabList).ToList())
Debug.LogError (prefab + " is missing in the /Resorces/Prefabs folder but used in Levels.xml");
foreach (string prefab in resPrefabList.Except(xmlPrefabList).ToList())
Debug.Log (prefab + " exists in the /Resorces/Prefabs folder but not used in Levels.xml");
Debug.Log ("Cross Check Done");
}
//Hallo Tim und Philipp. Die Datei kuckt nur ob irgendwas mit den Prefabs komisch ist.
// cross check /Resources/Prefabs and Levels.xml if there are any item prefabs that exist only in one but not the other
public void crossCheck ()
{
// create a list of /Resources/Prefabs for resources and Levels.Xml
List<string> resPrefabList = new List<string>();
List<string> xmlPrefabList = new List<string>();
// Get prefabs from Levels.xml
DeserializedLevels deserializedLevels = XmlIO.LoadXml<DeserializedLevels>("Levels");
foreach (DeserializedLevels.Level level in deserializedLevels.levels)
{
foreach (DeserializedLevels.Item item in level.items)
if (!xmlPrefabList.Contains(item.prefab))
xmlPrefabList.Add(item.prefab);
}
// Get prefabs from the /Resources/Prefabs folder
// get all child items in the /Resources/Prefabs folder
DirectoryInfo dir = new DirectoryInfo("Assets/Resources/Prefabs");
FileInfo[] fileInfos = dir.GetFiles("*.prefab");
fileInfos.Select(f => f.FullName).ToArray();
// Add each prefab's file name to prefabList and truncate the .prefab extension from the end
foreach (FileInfo fileInfo in fileInfos)
resPrefabList.Add (fileInfo.Name.Substring(0, fileInfo.Name.Length - ".prefab".Length));
// Cross checks
foreach (string prefab in xmlPrefabList.Except(resPrefabList).ToList())
Debug.LogError (prefab + " is missing in the /Resorces/Prefabs folder but used in Levels.xml");
foreach (string prefab in resPrefabList.Except(xmlPrefabList).ToList())
Debug.Log (prefab + " exists in the /Resorces/Prefabs folder but not used in Levels.xml");
Debug.Log ("Cross Check Done");
}
}
......@@ -6,135 +6,135 @@ using UnityEngine;
public class DeserializedLevelsLoader
{
// Levels deserialized
private DeserializedLevels deserializedLevels;
// Levels deserialized
private DeserializedLevels deserializedLevels;
private int currentLevelIndex = 0;
private int currentSegmentIndex = 0;
private int currentLevelIndex = 0;
private int currentSegmentIndex = 0;
private const string prefabsFolder = "Prefabs/";
private const string prefabsFolder = "Prefabs/";
struct ItemStruct
{
public GameObject prefab;
public float x;
public float y;
public float rot;
public float scalex;
public float scaley;
}
// Cache prefabs in prefabDict
Dictionary<string,GameObject> prefabPool;
struct ItemStruct
{
public GameObject prefab;
public float x;
public float y;
public float rot;
public float scalex;
public float scaley;
}
// Cache all items with locations
List<ItemStruct> sceneItemsList;
// Cache prefabs in prefabDict
Dictionary<string,GameObject> prefabPool;
Transform parentOfXmlItems;
public const string xmlItemsGOName = "XmlItems";
// Cache all items with locations
List<ItemStruct> sceneItemsList;
public void loadLevel (int levelIndex = 0)
{
prefabPool = new Dictionary<string, GameObject>();
sceneItemsList = new List<ItemStruct>();
Transform parentOfXmlItems;
// if the XmlItems gameobject folder remained in the Hierarcy, then delete it
while (GameObject.Find (xmlItemsGOName) != null)
MonoBehaviour.DestroyImmediate(GameObject.Find (xmlItemsGOName));
parentOfXmlItems = new GameObject(xmlItemsGOName).transform;
public const string xmlItemsGOName = "XmlItems";
deserializedLevels = XmlIO.LoadXml<DeserializedLevels>("Levels");
public void loadLevel (int levelIndex = 0)
{
prefabPool = new Dictionary<string, GameObject>();
sceneItemsList = new List<ItemStruct>();
// if startlevel is in the XML i.e. <Developer StartLevel="3" /> then get level from there
// otherwise start with level 1
currentLevelIndex = (levelIndex > deserializedLevels.levels.Length - 1) ? 0 : levelIndex;
// if the XmlItems gameobject folder remained in the Hierarcy, then delete it
while (GameObject.Find (xmlItemsGOName) != null)
MonoBehaviour.DestroyImmediate(GameObject.Find (xmlItemsGOName));
parentOfXmlItems = new GameObject(xmlItemsGOName).transform;
DeserializedLevels.Level currentLevel = deserializedLevels.levels[currentLevelIndex];
sceneItemsList.Clear();
deserializedLevels = XmlIO.LoadXml<DeserializedLevels>("Levels");
// <Item prefab="Chair" x="1" y="10" rot="90" />
foreach (DeserializedLevels.Item deserializedItem in currentLevel.items)
{
// caching prefabString i.e. "phone"
string prefabString = deserializedItem.prefab;
// if the prefab in the item XmlNode has not been loaded then add it to the prefabsDict dictionary,
if (!prefabPool.ContainsKey(prefabString))
{
// load prefab
GameObject prefabObject = Resources.Load(prefabsFolder + prefabString, typeof(GameObject)) as GameObject;
// if unsuccesful, error message and jump to next in the foreach loop
if (prefabObject == null)
{
Debug.LogError("Prefab \"" + prefabString + "\" does not exists.");
continue;
}
// otherwise add to dictionary
prefabPool.Add(prefabString, prefabObject);
}
ItemStruct item;
item.prefab = prefabPool[prefabString];
item.x = toFloatZeroIfNull(deserializedItem.x);
item.y = toFloatZeroIfNull(deserializedItem.y);
item.rot = toFloatZeroIfNull(deserializedItem.rot);
item.scalex = toFloatOneIfNull(deserializedItem.scalex);
item.scaley = toFloatOneIfNull(deserializedItem.scaley);
sceneItemsList.Add(item);
}
// if startlevel is in the XML i.e. <Developer StartLevel="3" /> then get level from there
// otherwise start with level 1
currentLevelIndex = (levelIndex > deserializedLevels.levels.Length - 1) ? 0 : levelIndex;
// Finally instantiate all items
foreach (ItemStruct item in sceneItemsList)
{
// TODO load height coordinate from a directory
GameObject newGameObject = MonoBehaviour.Instantiate(item.prefab) as GameObject;
DeserializedLevels.Level currentLevel = deserializedLevels.levels[currentLevelIndex];
sceneItemsList.Clear();
// set position
setPos2D(newGameObject, new Vector2(item.x, item.y));
// set rotation
setRot2D(newGameObject, item.rot);
// <Item prefab="Chair" x="1" y="10" rot="90" />
foreach (DeserializedLevels.Item deserializedItem in currentLevel.items)
{
// caching prefabString i.e. "phone"
string prefabString = deserializedItem.prefab;
setScale2D(newGameObject, item.scalex, item.scaley);
// if the prefab in the item XmlNode has not been loaded then add it to the prefabsDict dictionary,
if (!prefabPool.ContainsKey(prefabString))
{
// load prefab
GameObject prefabObject = Resources.Load(prefabsFolder + prefabString, typeof(GameObject)) as GameObject;
// set parent
newGameObject.transform.parent = parentOfXmlItems;
// if unsuccesful, error message and jump to next in the foreach loop
if (prefabObject == null)
{
Debug.LogError("Prefab \"" + prefabString + "\" does not exists.");
continue;
}
}
// DONE, these are only helper functions below
// otherwise add to dictionary
prefabPool.Add(prefabString, prefabObject);
}
// if no value then return zero or one, otherwise convert to float
float toFloatZeroIfNull (string value) { return value == null ? 0 : float.Parse(value); }
float toFloatOneIfNull (string value) { return value == null ? 1 : float.Parse(value); }
ItemStruct item;
item.prefab = prefabPool[prefabString];
item.x = toFloatZeroIfNull(deserializedItem.x);
item.y = toFloatZeroIfNull(deserializedItem.y);
item.rot = toFloatZeroIfNull(deserializedItem.rot);
item.scalex = toFloatOneIfNull(deserializedItem.scalex);
item.scaley = toFloatOneIfNull(deserializedItem.scaley);
void setPos2D(GameObject g, Vector2 pos)
{
g.transform.position = new Vector2 (
pos.x,
pos.y
);
sceneItemsList.Add(item);
}
void setRot2D(GameObject g, float rot)
// Finally instantiate all items
foreach (ItemStruct item in sceneItemsList)
{
//Debug.Log("Set rotation of " + g.name + " to " + rot);
Quaternion rotation = Quaternion.identity;
rotation.eulerAngles = new Vector3(0, 0, rot);
g.transform.localRotation = rotation;
}
void setScale2D(GameObject g, float scaleX, float scaleY)
{
g.transform.localScale = new Vector2(scaleX, scaleY);
// TODO load height coordinate from a directory
GameObject newGameObject = MonoBehaviour.Instantiate(item.prefab) as GameObject;
// set position
setPos2D(newGameObject, new Vector2(item.x, item.y));
// set rotation
setRot2D(newGameObject, item.rot);
setScale2D(newGameObject, item.scalex, item.scaley);
// set parent
newGameObject.transform.parent = parentOfXmlItems;
}
}
// DONE, these are only helper functions below
// if no value then return zero or one, otherwise convert to float
float toFloatZeroIfNull (string value) { return value == null ? 0 : float.Parse(value); }
float toFloatOneIfNull (string value) { return value == null ? 1 : float.Parse(value); }
void setPos2D(GameObject g, Vector2 pos)
{
g.transform.position = new Vector2 (
pos.x,
pos.y
);
}
void setRot2D(GameObject g, float rot)
{
//Debug.Log("Set rotation of " + g.name + " to " + rot);
Quaternion rotation = Quaternion.identity;
rotation.eulerAngles = new Vector3(0, 0, rot);
g.transform.localRotation = rotation;
}
void setScale2D(GameObject g, float scaleX, float scaleY)
{
g.transform.localScale = new Vector2(scaleX, scaleY);
}
}
......@@ -4,68 +4,68 @@ using System.Xml;
public class DeserializedLevelsSaver
{
public const string xmlItemsToExportGOName = "XmlItemsToExport";
public void saveExportItems ()
{
// Create XmlItemsToExport if does not exist yet
if (GameObject.Find (xmlItemsToExportGOName) == null)
new GameObject(xmlItemsToExportGOName);
GameObject xmlItemsToExportGO = GameObject.Find (xmlItemsToExportGOName);
var xmlItemsToExportGOchildren = xmlItemsToExportGO.GetComponentsInChildren<Transform>();
// Check if any children exist
if (xmlItemsToExportGOchildren.Length == 0)
Debug.LogError ("Add the prefabs to " + xmlItemsToExportGOName);
DeserializedLevels.Level levelXml = new DeserializedLevels.Level();
int n = 0;
// count number of children skipping sub-items
foreach (Transform item in xmlItemsToExportGOchildren)
if (item.parent == xmlItemsToExportGO.transform) n++;
// the items array should have that many elements
levelXml.items = new DeserializedLevels.Item[n];
// use i for counting items, i would be equal (one more to be precise) to n at the end of the cycle
int i = 0;
// cycle through the children again and add them to items
foreach (Transform item in xmlItemsToExportGOchildren)
{
// skip sub-items
if (item.parent != xmlItemsToExportGO.transform) continue;
levelXml.items[i] = new DeserializedLevels.Item();
levelXml.items[i].prefab = item.name;
levelXml.items[i].x = toStringNullIfZero(item.transform.position.x);
levelXml.items[i].y = toStringNullIfZero(item.transform.position.y);
levelXml.items[i].rot = toStringNullIfZero(item.localRotation.eulerAngles.z);
levelXml.items[i].scalex = toStringNullIfOne(item.localScale.x);
levelXml.items[i].scaley = toStringNullIfOne(item.localScale.y);
// increase i for the next cycle
i++;
}
// Export just one level
DeserializedLevels levelsXmlToExport = new DeserializedLevels();
levelsXmlToExport.levels = new DeserializedLevels.Level[1];
levelsXmlToExport.levels[0] = levelXml;
XmlIO.SaveXml<DeserializedLevels>(levelsXmlToExport, "./Assets/Resources/" + xmlItemsToExportGOName + ".xml");
}
string toStringNullIfZero (float num) { return num == 0 ? null : mathRound(num,2).ToString(); }
string toStringNullIfOne (float num) { return num == 1 ? null : mathRound(num,2).ToString(); }
float mathRound (float round, int decimals)
{
return Mathf.Round(round * Mathf.Pow(10,decimals)) / Mathf.Pow(10,decimals);
}
public const string xmlItemsToExportGOName = "XmlItemsToExport";
public void saveExportItems ()
{
// Create XmlItemsToExport if does not exist yet
if (GameObject.Find (xmlItemsToExportGOName) == null)
new GameObject(xmlItemsToExportGOName);
GameObject xmlItemsToExportGO = GameObject.Find (xmlItemsToExportGOName);
var xmlItemsToExportGOchildren = xmlItemsToExportGO.GetComponentsInChildren<Transform>();
// Check if any children exist
if (xmlItemsToExportGOchildren.Length == 0)
Debug.LogError ("Add the prefabs to " + xmlItemsToExportGOName);
DeserializedLevels.Level levelXml = new DeserializedLevels.Level();
int n = 0;
// count number of children skipping sub-items
foreach (Transform item in xmlItemsToExportGOchildren)
if (item.parent == xmlItemsToExportGO.transform) n++;
// the items array should have that many elements
levelXml.items = new DeserializedLevels.Item[n];
// use i for counting items, i would be equal (one more to be precise) to n at the end of the cycle
int i = 0;
// cycle through the children again and add them to items
foreach (Transform item in xmlItemsToExportGOchildren)
{
// skip sub-items
if (item.parent != xmlItemsToExportGO.transform) continue;
levelXml.items[i] = new DeserializedLevels.Item();
levelXml.items[i].prefab = item.name;
levelXml.items[i].x = toStringNullIfZero(item.transform.position.x);
levelXml.items[i].y = toStringNullIfZero(item.transform.position.y);
levelXml.items[i].rot = toStringNullIfZero(item.localRotation.eulerAngles.z);
levelXml.items[i].scalex = toStringNullIfOne(item.localScale.x);
levelXml.items[i].scaley = toStringNullIfOne(item.localScale.y);
// increase i for the next cycle
i++;
}
// Export just one level
DeserializedLevels levelsXmlToExport = new DeserializedLevels();
levelsXmlToExport.levels = new DeserializedLevels.Level[1];
levelsXmlToExport.levels[0] = levelXml;
XmlIO.SaveXml<DeserializedLevels>(levelsXmlToExport, "./Assets/Resources/" + xmlItemsToExportGOName + ".xml");
}
string toStringNullIfZero (float num) { return num == 0 ? null : mathRound(num,2).ToString(); }
string toStringNullIfOne (float num) { return num == 1 ? null : mathRound(num,2).ToString(); }
float mathRound (float round, int decimals)
{
return Mathf.Round(round * Mathf.Pow(10,decimals)) / Mathf.Pow(10,decimals);
}
}
......@@ -5,25 +5,25 @@ using UnityEngine; // necessary for TextAsset
public static class XmlIO
{
public static void SaveXml<T> (this object deserializedXml, string path) where T : class
{
using(var stream = new FileStream(path, FileMode.Create))
{
var s = new XmlSerializer(typeof(T));
s.Serialize(stream, deserializedXml);
}
}
public static void SaveXml<T> (this object deserializedXml, string path) where T : class
{
using(var stream = new FileStream(path, FileMode.Create))
{
var s = new XmlSerializer(typeof(T));
s.Serialize(stream, deserializedXml);
}
}
public static T LoadXml<T>(string textAssetName) where T : class
{
TextAsset xmlTextAsset = (TextAsset) Resources.Load (textAssetName, typeof(TextAsset));
public static T LoadXml<T>(string textAssetName) where T : class
{
TextAsset xmlTextAsset = (TextAsset) Resources.Load (textAssetName, typeof(TextAsset));
using(var stream = new StringReader(xmlTextAsset.text))
{
var s = new XmlSerializer(typeof(T));
T deserializedXml = s.Deserialize(stream) as T;
return deserializedXml;
}
}
using(var stream = new StringReader(xmlTextAsset.text))
{
var s = new XmlSerializer(typeof(T));
T deserializedXml = s.Deserialize(stream) as T;
return deserializedXml;
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment