Jump to content
Unity Insider Forum

LarsB

Members
  • Content count

    11
  • Joined

  • Last visited

Community Reputation

2 Neutral

About LarsB

  • Rank
    Member

Recent Profile Visitors

53 profile views
  1. LarsB

    Level per XML-Datei generieren

    Um mein Thema abzuschließen: Ich habe LitJson genutzt. Json.NET von Newtonsoft soll zwar schneller sein. Mit LitJson kam ich aber besser klar. Meine Json-Datei sieht jetzt so aus: { "Levels":[ { "id": 0, "xSize": 7, "ySize": 7, "phases": [ { "id": 0, "fields": [ { "xPosition": 1, "yPosition": 1, "typeID": 0, "setup": "3,4,1,4" }, { "xPosition": 0, "yPosition": 1, "typeID": 0, "setup": "1,2,4,3" } ] }, { "id": 1, "fields": [ { "xPosition": 0, "yPosition": 1, "typeID": 0, "setup": "1,3,5,2" }, { "xPosition": 2, "yPosition": 1, "typeID": 0, "setup": "2,1,2,1" } ] } ] }, ... Mit meinem LevelHandler lese ich die Level / Phasen aus: private JsonData itemData; private JsonData fieldData; void Awake() { string jsonString = File.ReadAllText(Application.dataPath + "/Resources/jLevels.json"); itemData = JsonMapper.ToObject(jsonString); } public JsonData GetPhaseJsonData(int level, int phase) { fieldData = itemData["Levels"][level]["phases"][phase]; return fieldData; } ... und im BoardManagerScript frage ich die Level ab JsonData fieldData = this.gameObject.GetComponent<LevelHandler>().GetPhaseJsonData(level, phase); for (int i = 0; i < fieldData["fields"].Count; i++) { // Feldeigenschaften aus der Datenbank auslesen x = (int)fieldData["fields"][i]["xPosition"]; y = (int)fieldData["fields"][i]["yPosition"]; fieldType = (int)fieldData["fields"][i]["typeID"]; ... Klappt alles wunderbar. Danke noch einmal für eure Hilfe.
  2. LarsB

    Level per XML-Datei generieren

    Danke. Das schaue ich mir einmal an und berichte dann
  3. LarsB

    Level per XML-Datei generieren

    Ich denke, dann sollte ich auf JSON umsteigen. Gut, dass ich gefragt habe 😉 Welche externe JSON-Bibliothek würdet ihr denn empfehlen? Falls euch spontan keine einfällt, kann ich ja auch selber einmal auf die Suche gehen...
  4. LarsB

    Level per XML-Datei generieren

    Meine XML-Datei ist wie folgt aufgebaut: <level0001> <phase1> <field> In meinem LevelHandler frage ich das wie folgt ab: levelList = levelDoc.GetElementsByTagName("level0001"); // Abfrage des Levels foreach (XmlNode levelData in levelList) { XmlNodeList phaseList = levelData.ChildNodes; // Abfrage der Phasen foreach (XmlNode phaseData in phaseList) { if (phaseData.Name == phase) { XmlNodeList fieldList = phaseData.ChildNodes; // Abfrage der Felder return fieldList; Macht das Sinn. Oder gibt es einen besseren Weg, um an die Felder-Liste zu kommen? Es sind immer unterschiedliche Anzahl an Feldern. Und es gibt nicht nur Farbfelder sondern auch Weichen, Pipelines und weitere Felder. Beides ist aber gleich schnell?!
  5. Ich habe wieder eine Frage, ob meine Lösung gut ist oder ob ihr Verbesserungsmöglichkeiten seht. Mein Projekt besteht aus mehreren Leveln mit mehreren Phasen, wobei die Phasen innerhalb eines Level aufeinander aufbauen. Daher kann ich meines Erachtens nicht mit Scenes arbeiten, um die jeweiligen Phasen darzustellen, da die Darstellung der Objekte einer Phase von den vorherigen Phasen abhängig sein könnten. Ich habe mich daher dazu entschieden, alle Level mit den dazugehörigen Phasen in eine XML-Datei zu packen, die wie folgt aussieht (zu Testzwecken nur mit einem Level mit einer Phase): <levels> <level0001> <phase1> <field> <x_position>1</x_position> <y_position>1</y_position> <type>0</type> <setup>3, 4, 1, 4</setup> </field> <field> <x_position>0</x_position> <y_position>1</y_position> <type>0</type> <setup>3, 4, 1, 4</setup> </field> </phase1> </level0001> </levels> Um die XML-Datei auszulesen, habe ich einen LevelHandler gebaut mit einer Methode, die sämtliche Felder einer bestimmte Phase eines Levels in eine Liste packt. Hier der Code dazu: public XmlNodeList GetFieldArray(string level, string phase) { levelList = levelDoc.GetElementsByTagName(level); foreach (XmlNode levelData in levelList) { XmlNodeList phaseList = levelData.ChildNodes; foreach (XmlNode phaseData in phaseList) { if (phaseData.Name == phase) { XmlNodeList fieldList = phaseData.ChildNodes; return fieldList; } } } return null; } Auf diesen LevelHandler greife ich in meinem BoardManager zu: fieldList = this.gameObject.GetComponent<LevelHandler>().GetFieldArray(level, phase); Dann gehe ich durch alle Daten der Liste und lese die x-, y-Koordinaten und den Feldtyp aus: foreach (XmlNode fieldData in fieldList) { XmlNodeList fieldInfo = fieldData.ChildNodes; x = int.Parse(fieldInfo[0].InnerText); y = int.Parse(fieldInfo[1].InnerText); fieldType = int.Parse(fieldInfo[2].InnerText); GameObject ... // s.u. Den Feldtyp habe ich im BoardManager vorher in einem Array definiert: public GameObject color_field; private GameObject[] field_type; void Start () { field_type = new GameObject[10]; field_type[0] = color_field; ... In der XML wird die ID des Feldtyps abgespeichert. Im BoardManager lege ich ein Array mit allen GameObjects an (bislang zu Testzwecken erst eins). Mit den x-, y-Koordinaten und dem Feldtyp kann ich dann in der foreach-Schleife (s.o.) das GameObject für den Level erzeugen: GameObject newColorField = Instantiate(field_type[fieldType], new Vector3(startX + (xOffset * x), startY + (yOffset * y), 0), field_type[fieldType].transform.rotation); Das klappt auch alles. Nun meine Frage, ob es noch Verbesserungsmöglichkeiten gibt, insbesondere: Bietet sich für meinen Fall die Generierung eines Level über XML an? Soll ich alle Level in eine XML-Datei packen? Es können einige hundert Level mit mehreren Phasen und vielen Feldern werden. Macht es Sinn, im LevelHandler mit ChildNodes zu arbeiten, um eine bestimmte Phase eines Levels zu erreichen? Gibt es einen besseren Weg, als die GameObject-ID aus der XML auszulesen und aus dem Ergebnis ein GameObject zu erzeugen? Danke schon einmal für eure Anmerkungen. Viele Grüße, Lars
  6. LarsB

    Arbeiten mit ChildObjects

    Danke für den Tipp. Das macht sicher Sinn...
  7. LarsB

    Arbeiten mit ChildObjects

    Ja. Stimmt. Das hatte ich übersehen 😊 So klappt es. Perfekt! Danke für eure Hilfe! 😃
  8. LarsB

    Arbeiten mit ChildObjects

    oben = this.gameObject.transform.GetChild(0).gameObject; ... ginge auch. In diesem Fall müsste man nur aufpassen, dass man die Sortierung der ChildObjects nicht verändert. Wäre die GetChild-Methode schneller als die Find-Methode?
  9. LarsB

    Arbeiten mit ChildObjects

    Ich vergaß noch zu erwähnen: Das ChildObject definiere ich in der Awake-Methode: private GameObject oben = null; void Awake() { oben = this.gameObject.transform.Find("oben").gameObject; } Habe meinen Beitrag entsprechend geändert. Du schreibst, dass die Find-Methode relativ langsam sei. Wie komme ich sonst - schneller - an das ChildObject?
  10. Guten Morgen zusammen, ich fange gerade an, mit Unity zu arbeiten. Daher würde ich mich darüber freuen, wenn ihr mir Rückmeldung geben könntet, ob der nachfolgend beschriebene Weg für mein Problem der richtige ist oder ob ihr andere Lösungsmöglichkeiten habt. Zentraler Bestandteil meines Projekts sind Farbfelder, die (bislang) fünf verschiedene Farben annehmen können. Allerdings kann das Farbfeld weitere Elemente haben. So kann das Farbfeld an jeder Seite eine Ein- oder Ausgangspipelines haben. Außerdem können sich der Rand und der Hintergrund der Pipeline farblich ändern. Insgesamt kommt man so auf bis zu 11 verschiedene Elemente, die 5 verschiedene Farben annehmen können. Wenn ich mich nicht verrechnet habe, wären also 161.051 Kombinationen möglich. Es macht natürlich keinen Sinn, so viele GameObjects zu erstellen. Ich habe mich daher dazu entschieden, mit ChildObjects zu arbeiten. Das GameObject „Farbfeld“ hat also mehrere ChildObjects, welche die einzelnen Elemente (Pipelines, Farbfeld, Rand, Hintergrund) repräsentieren. Aus dem GameObject „Farbfeld“ mit seinen Child-Objekten habe ich ein Prefab erstellt, mit denen ich zur Laufzeit das Spielfeld erstelle: GameObject newColorField = Instantiate(color_field, new Vector3(startX + (xOffset * x), startY + (yOffset * y), 0), color_field.transform.rotation); Das ChildObject definiere ich in der Awake-Methode: private GameObject oben = null; void Awake() { oben = this.gameObject.transform.Find("oben").gameObject; } Sollte das GameObject bestimmte Elemente nicht haben, also z.B. oben keine Pipeline, dann deaktiviere ich diese: this.gameObject.transform.Find("oben").gameObject.SetActive(false); Wenn eine Pipeline eine bestimmte Farbe annimmt, tausche ich das Sprite aus (ich arbeite mit Sprites, da ich diese animieren möchte, um den Farbverlauf darzustellen): public Sprite oben_rot; private void change_color() { oben.GetComponent<SpriteRenderer>().sprite = oben_rot; } Das funktioniert auch alles soweit. Meine Frage wäre aber: Ist das für euch ein gangbarer Weg? Oder habt ihr einen anderen, besseren Weg? Gibt es vergleichbare Projekte, die es anders gelöst haben? Danke schon einmal für eure Hilfe. Viele Grüße Lars
  11. Liebe Unity Community, bevor ich euch mit meinen Fragen löchere - und hoffentlich hier und da auch wertvolle Hilfen geben kann - möchte ich mich einmal kurz vorstellen. Ich bin von Hause aus kein Programmierer sondern Jurist und betreibe das Programmieren als Hobby. Die letzten Jahre habe ich mich mit einer App für den Handballbereich beschäftigt, die ich zunächst für das Apple-, später dann für das Android-Betriebssystem herausgebracht habe. Möchte jetzt keine Reklame machen, aber nur zur Anschauung hier der Link zur aktuellen App und zur Webseite. Als nächstes Projekt möchte ich mir ein Mobile-Game vornehmen, das ich - natürlich - mit Unity programmieren möchte. Mir fällt es schwer, das Spiel zu kategorisieren, aber ich würde es als rundenbasiertes Strategiespiel einordnen, wobei das Gamedesign - ähnlich wie beim Schach - auf rudimentäre Elemente heruntergebrochen wird. Konkret geht es um Farbfelder, die durch geschicktes Setzen der Figuren verändert werden können. Ziel des Spiels ist es, durch das Setzen der Figuren so viele Punkte wie möglich zu holen und den Gegner zu bezwingen. Soviel kurz zu meiner Person und meinem Projekt. Ich freue mich auf den Austausch mit euch. Viele Grüße Lars
×