Jump to content
Unity Insider Forum

Jaimi93

Members
  • Posts

    9
  • Joined

  • Last visited

  • Days Won

    1

Jaimi93 last won the day on June 23

Jaimi93 had the most liked content!

Recent Profile Visitors

109 profile views

Jaimi93's Achievements

Newbie

Newbie (1/3)

1

Reputation

  1. Hab den Fehler gefunden. Weil im Tutorial viele Variablen, Datentypen und Dateinnamen gleich sind, hab ich ein paar Dinge verwechselt. Das Verküpfen und Einlesen der XML Datei funktionieren jetzt 🥳 void Start() { ImportQuestions IQ = ImportQuestions.Load(sPath); //For each item in the List "item" foreach(QuestionsStructure Q in IQ.items) { //UnityEngine.Debug.Log(Q.index); print(Q.iIndexQuestion); } } [XmlRoot("QuestionCollector")] public class ImportQuestions { [XmlArray("Questions")] [XmlArrayItem("Q")] public List<QuestionsStructure> items = new List<QuestionsStructure>(); public static ImportQuestions Load(string sPath) { TextAsset _xmlFile = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/XML/Questions.xml"); XmlSerializer serializer = new XmlSerializer(typeof(ImportQuestions)); StringReader reader = new StringReader(_xmlFile.text); ImportQuestions item = serializer.Deserialize(reader) as ImportQuestions; reader.Close(); return item; } }
  2. Also langsam verzweifel ich ein bisschen. Ich hab ein Attribut (index) hinzugefügt und den kompletten Code von einem Tutorial auf YT übernommen (siehe ganz unten). Trotzem beschwert sich Unty: "'ImportQuestions' does not contain a definition for 'Questions' and no accessible extension method 'Questions' accepting a first argument of type 'ImportQuestions' could be found (are you missing a using directive or an assembly reference?)" und "'QuestionsStructure' does not contain a definition for 'index' and no accessible extension method 'index' accepting a first argument of type 'QuestionsStructure' could be found (are you missing a using directive or an assembly reference?)" Ich hab keine Ahnung, warum Unity die beiden Klassen nicht erkennt. Mit der foreach-Schleife möchte ich eigentlich nur prüfen, ob das Einbinden der Datei funktioniert hat 😓 Der Code, wo Unity ein Probelm damit hat: public class QuestionInteraction : MonoBehaviour { ... //String for the XML document ele Q public const string sPath = "Questions"; // Start is called before the first frame update void Start() { ImportQuestions IQ = ImportQuestions.Load(sPath); foreach(QuestionsStructure Q in IQ.Questions) { UnityEngine.Debug.Log(Q.index); } } ... } Die Klassen ImportQuestions und QuestionStructure sind in jeweils seperaten Dateien definiert: [XmlRoot(ElementName = "QuestionCollector")] public class ImportQuestions { [XmlArray("Questions")] [XmlArrayItem("Q")] public List<QuestionsStructure> items = new List<QuestionsStructure>(); public static ImportQuestions Load(string sPath) { TextAsset _xmlFile = AssetDatabase.LoadAssetAtPath<TextAsset>("Assets/XML/Questions.xml"); XmlSerializer serializer = new XmlSerializer(typeof(ImportQuestions)); StringReader reader = new StringReader(_xmlFile.text); ImportQuestions item = serializer.Deserialize(reader) as ImportQuestions; reader.Close(); return item; } } public class QuestionsStructure { [XmlAttribute("index")] public int iIndexQuestion; [XmlElement("Word")] public string sWord; [XmlElement("Correct")] public string sCorrect; [XmlElement("Wrong1")] public string sWrong1; [XmlElement("Wrong2")] public string sWrong2; } Quelle des YT Videos:
  3. @Sascha Danke für deine Antwort. Sie hat mir sehr geholfen Ein paar Fragen habe ich dann aber noch. Ich hab im Internet einen Code gefunden der ein XML Dokument ausliest und frage mich, ob ich es mit deiner Lösung kombinieren kann: using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System.Xml; using System.Xml.Serialization; [XmlRoot(ElementName = "Questions")] public class ImportQuestions : MonoBehaviour { //Import the XML File public TextAsset TxmlRawFile; [XmlType(TypeName = "Q")] public class CXmlItem { [XmlElement(ElementName = "Word")] public string sWord; [XmlElement(ElementName = "Correct")] public string sCorrect; [XmlElement(ElementName = "Wrong1")] public string sWrong1; [XmlElement(ElementName = "Wrong2")] public string sWrong2; } ... } Wenn ich anstatt der Klasse in der Klasse das Struct verwende und dann ein Array erzeuge, würde es doch dann funktionieren, oder? ... [XmlType(TypeName = "Q")] public struct CXmlItem { [XmlElement(ElementName = "Word")] public string sWord; [XmlElement(ElementName = "Correct")] public string sCorrect; [XmlElement(ElementName = "Wrong1")] public string sWrong1; [XmlElement(ElementName = "Wrong2")] public string sWrong2; } public CXmlItem [] XmlItem; ... Oder erzeugt es automatisch dann ein Array oder Liste, wo alle Elemente gespeichert werden? Da ich diese Art der Deklaration davor noch nicht gesehen habe, verwirrt es mich etwas. (Außer bei der Defintion von einer Range. Aber das ist wahrscheinlich nicht das Gleiche...)
  4. @Sascha Danke für Deine Antwort 😄 Ok, werd ich beim nächsten Mal beachten 🙈 Weil ich dachte, dass ich ein Array wie eine Tabelle mache, wo die Frage, richtige Antwort und beiden falschen Antworten drinstehen. Darum sollte es n-Zeilen haben und 4 Spalten. Die Anzahl der Zeilen sollten anhand der Länge des Fragenkataloges definiert werden. Zumindes habe ich mir das so gedacht. Zuerst hab ich mir auch gedacht, dass eine gute Idee wäre, wenn ich eine externe txt-Datei verwende. Hab dann aber festgestellt, dass es mit XML vielleicht einfacher geht. Aber ich glaub, ich denk wieder zu kompliziert... war würdest du anstatt einem Array verwenden?
  5. Hallo 😄 Momentan arbeite ich an einem Lernspiel, welches Vokabeln spielerisch abfragen soll. Das Spiel besteht aus Jump´n´Run- und Frageteilen. Der Jump´n´Runteil funktioniert prima und die Menüs auch. Jetzt muss ich nur noch den schwierigsten Teil des Spiel programmieren: den Fragenteil. Ich habe mir überlegt, dass ich das Skript "ImportQuestions" für die Einbindung und Verarbeitung der externen XML-Datei und das Skript "QuestionInteraction" sich um die Darstellung und Interaktion mit dem Gamer kümmern soll. Bin trotzdem aber noch etwas ratlos, wie ich das in C# und Unity umsetzen kann. Mein bisheriger Code in ImportQuestions: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.IO; public class ImportQuestions : MonoBehaviour { //Import the txt file and save it in array //Path string sPath = "Assets/Questions/English.txt"; //Array public int iQuestions; string[,] QuestionArray = new string[iQuestions, 4]; void Start() { SetArrayQuestions(); } public void SetArrayQuestions() { //Fill the array with the questions and answers //Read the file StreamReader reader = new StreamReader(sPath); //Save in arrays reader.Close(); } public void GetArrayQuestions() { //Get the questions and anwers for the text field } Das ich das Array nach der Anzahl der Fragen beliebig erweitern möchte, habe ich die Variable iQuestions eingeführt. Jedoch meckert Unity darüber. Geplant ist, dass Fragen und Antworten wie folgt in der XML-Datei deklariert werden: <Questions> <Q> <Word>Hello</Word> <Correct>Hallo</Correct> <Wrong1>Nein</Wrong1> <Wrong2>Hase</Wrong2> </Q> </Questions> Ich hoffe, dass ihr mir bei diesem Problem weiterhelfen könnt 😅 Vielen Dank im Voraus 😁
  6. @Sascha Danke für die ausführliche Antwort 👍
  7. Hallihallo, ich habe ein paar Fragen, zu der es sehr viele verschiedene Meinungen gibt. Trotzdem möchte ich gerne eure Meinung wissen. Während meines Studiums habe ich C++ gelernt, daher ist mir das Erlernen von C# einfach gefallen. Trotzdem unterscheiden sich die beiden Programmiersprachen für mich. In C++ gibt es eine Hauptdatei und Dateien für Klassen, die auch auf einander zugereifen und kommunizieren können. In C# scheint es nur Skripts zu geben, die unabhängig von einander agieren. Da ich noch nicht so viel Erfahrung habe mit dem Umgang von Unity und C#, weiß ich noch nicht, ob und wie ich diese Skipte zusammenarbeiten lassen kann. Zwar habe ich es schon mit dem Befehl "using Dateiname;" versucht, trotzdem konnte ich nicht auf die Funktionen des anderen Skripts zugreifen. Da beide Skripte nicht mit dem selben GameObject verbunden sind, kann ich das andere Skript nicht Hilfe von Components ansprechen. Auch stell ich mir die Fragen, was ein guter Programmierstil ist in Unity. Und ob ich, wie in C++, verschiedene Klassen in verschiedenen Skripten erstellen und dann in einem Hauptskript zusammenfügen kann, um die Spiellogik zu definieren. Oder ob das nicht erlaubt ist. Ich habe mir schon einige Tutorials angeschaut zum Thema "Programmierung in Unity" und festgestellt, dass der Programmierstil sehr verschieden ist. Manche verwenden sehr viele Scripts, manche wenige. Daher möchte ich wissen, was eure Meinung zu diesem Thema ist. Freue mich auf eure Beiträge Vielen Dank im Voraus 😄
  8. Hallo, @Sascha Vielen Dank für Deine schnelle Antwort 😄 Sie hat mir sehr geholfen. Ich hab jetzt in Update() die Bedingung für NeuesSpiel() geschrieben: if(bVerloren == true || bGewonnen == true) { bSpielGestartet = false; TInfo.text = "Nochmal spielen? J/N"; if (Input.GetKeyDown(KeyCode.J)) { bSetKeyJ = true; } else if (Input.GetKeyDown(KeyCode.N)) { bSetKeyJ = false; } NeuesSpiel(bSetKeyJ); } Meine Funktion NeuesSpiel() sieht jetzt so aus: void NeuesSpiel(bool bKey) { if (bKey == true) { if (bGewonnen == true) { if (iAnzSpiele == 1) { fHighscore = fEndZeit; } else if (iAnzSpiele > 1 && fHighscore > fEndZeit) { fHighscore = fEndZeit; } } TInfo.text = string.Format("Highscore: {0,6:0.0} sec.", fHighscore); SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } else if(bKey == false) { iAnzSpiele = 0; Application.Quit(); } } bVerloren und bGewonnen werden bei mir in der void OnCollisionEnter2D(Collision2D coll) auf true gesetzt. bSetKeyJ wird in Start() mit false initialisiert. Trotzdem wird das Textfeld mit der Frage "Nochmal spielen? J/N" nicht angezeigt. Die Funktion NeuesSpiel() wird daher gar nicht erst aufgerufen. Ich denke, dass die Bedingung entweder nicht richtig geprüft wird oder die Werte nicht richtig übermittelt werden. Das mit der enable-Eigenschaft verwirrt mich ein bisschen. Wie kann ich diese Funktion am Besten im Code ansprechen? Ich benutze nur 2 Skripte für das Spiel und das meiste wird in der Hero.cs ausgeführt. Muss ich dafür in der Hero.cs ein GameObject "GameOver" erzeugen? Oder gibt es eine Klasse oder Event von Unity für den Fall GameOver? Vielen Dank für deine Hilfe
  9. Hallihallo 😄 ich programmiere gerade mein erstes Jump´n´Run Spiel in Unity. Leider habe ich nach vielen Recherchen und Videos immer noch nicht das Problem "Spiel neu starten/beenden" nicht gelöst. Mein Idee war es, den Spieler*in zu fragen, ob sie/er das Spiel nochmal spielen möchte. Durch die Eingabe von "j" oder "n" soll die Frage beantwortet werden. Momentan verwende ich diesen Code: void NeuesSpiel() { bool bKeyJ = false; bool bKeyN = false; if (Input.GetKeyDown(KeyCode.J)) { bKeyJ = true; } else if (Input.GetKeyDown(KeyCode.N)) { bKeyN = true; } if (bKeyJ == true) { if (bGewonnen == true) { if (iAnzSpiele == 1) { fHighscore = fEndZeit; } else if (iAnzSpiele > 1 && fHighscore > fEndZeit) { fHighscore = fEndZeit; } } TInfo.text = string.Format("Highscore: {0,6:0.0} sec.", fHighscore); SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); } else if(bKeyN == true) { iAnzSpiele = 0; Application.Quit(); } } Leider reagiert Unity nicht auf die Eingabe und ich weiß nicht, welchen Fehler im Code steckt. Zuvor habe ich auch schon die Funktion Input.GetKey() verwendet oder die Boolwerte weggelassen und die Tastenabfrage direkt in der if-Bedingung abgefragt. Das Ergebnis war leider immer das Gleiche. Ich hoffe, dass Sie mir bei diesen Problem weiterhelfen können. Vielen Dank im Voraus für Ihre Hilfe 😄
×
×
  • Create New...