Von VB generierte txt/ini mit JS/C# auslesen.

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Eingehend auf Deine PN erkläre ich den Code:

    (Ich finde den C++/C Code Tag nicht, deshalb verwende ich den einfachen Code Tag

    Quellcode

    1. String Contents = System.IO.File.ReadAllText("Pfad", System.Text.Encoding.Default);
    2. String[] SplittedContents = Contents.Split('Zeichen');


    Ich gehe mal den Code von ganz vorne bis ganz hinten durch:
    • "String"
      String ist ein Typ und leitet (weil er am Anfang der Zeile steht) eine Deklaration ein.
    • "Contents"
      gibt den Bezeichner der Variable an.
    • "="
      leitet eine Zuweisung ein.
    • "System.IO.File.ReadAllText()" ist eine Funktion, die den Inhalt einer im Dateisystem gespeicherten Datei in Form eines Strings, entsprechend der übergebenen Kodierung zurückgibt.
    • "Pfad"
      soll den Pfad zur Datei darstellen, die Du einlesen willst.
      Was das genau sein soll musst Du wissen.
    • "System.Text.Encoding.Default"
      ist eine Kodierung, anhand der die entsprechenden Symbole der Bytefolge in der Datei ausgewählt werden.
    • ";"
      schließt den Befehl ab.
    • "String"
      String ist ein Typ und leitet (weil er am Anfang der Zeile steht) eine Deklaration ein.
    • "[]"
      Gibt an, dass es sich um ein 1-dimensionales, unbestimmt langes Array des voranstehenden Typs handelt.
    • SplittedContents
      gibt den Bezeichner der Variable an.
    • "="
      leitet eine Zuweisung ein.
    • "Contents"
      ist der Bezeichner einer Variable vom Typ String.
    • .Split()
      ist eine Erweiterungsfunktion des String Typs, die ein Array von Strings zurückgibt.
      Die einzelnen Strings des zurückgegebenen Arrays werden durch Teilen des Ausdruckes auf den die Funktion angewandt wird errechnet.
    • "'Zeichen'"
      soll das Zeichen darstellen, an dem die .Split() Funktion den String teilen soll.
      Die ' (einfaches Anführungszeichen) geben an, dass es sich bei dem enthaltenen Ausdruck um einen Ausdruck vom Typ Char (ein einzelnes Zeichen) handelt.
      Ein Beispiel wäre: '\n'
    • ";"
      schließt den Befehl ab.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ok gut danke für deine Beschreibung. :) Jetzt kommt mir jedoch die frage auf was '\n' oder '\s' usw ist und wiso geht z.b. '\f' nicht. Also wenn ich den Teil verstehen würde, könnte ich evtl auch mehr mit den beiträgen die ich in Google gefunden habe anfangen.

    Zudem kommt hinzu das Unity mir das hier anzeigt:
    Spoiler anzeigen

    Assets/splashscreen.cs(18,29): error CS0236: A field initializer cannot reference the nonstatic field, method, or property `splashscreen.Contents'
    '\n' sollte einen Zeilenumbruch darstellen.
    Das \ stellt eine Escape Sequenz dar, wodurch das nachfolgende n nicht als n interpretiert wird, sondern entsprechend der Bedeutung des n als Zeilenumbruch.

    Deine Fehlermeldung sagt Dir, dass ein Feldinitialisierer auf ein nichtstatisches Feld, auf eine nichtstatische Methode oder eine nichtstatische Eigenschaft zugreift.
    Zusätzlich gibt sie Dir die Info, dass es sich um splashscreen.Contents handelt, also um
    String Contents = System.IO.File.ReadAllText("Pfad", System.Text.Encoding.Default);

    Kopiere bitte mal die Zeile wie Du sie im Code hast hier rein.

    Edit: Oder
    String[] SplittedContents = Contents.Split('Zeichen');

    aber das wissen wir erst, wenn Du den Code kopiert hast.

    Edit2:
    Markiere auch bitte, welche Zeile die Zeile nr. 18 ist.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ok, das ist der jetzige Code

    Quellcode

    1. //Text auslesen und Splitten
    2. string Contents = System.IO.File.ReadAllText(System.Environment.CurrentDirectory + "/" + "settings.txt", System.Text.Encoding.Default);
    3. string[] SplittedContents = Contents.Split('\n');


    und Zeile 18 ist:

    Quellcode

    1. string[] SplittedContents = Contents.Split('\n');


    Spoiler anzeigen

    und hier nochmal der gesammte Code:

    Quellcode

    1. using UnityEngine;
    2. using System.Collections;
    3. using System.IO;
    4. public class splashscreen : MonoBehaviour {
    5. public float timer = 2f;
    6. public string levelToLoad = "menu";
    7. // Use this for initialization
    8. void Start () {
    9. StartCoroutine("DisplayScene");
    10. }
    11. //Text auslesen und Splitten
    12. string Contents = System.IO.File.ReadAllText(System.Environment.CurrentDirectory + "/" + "settings.txt", System.Text.Encoding.Default);
    13. string[] SplittedContents = Contents.Split('\n');
    14. IEnumerator DisplayScene() {
    15. yield return new WaitForSeconds(timer);
    16. Application.LoadLevel(levelToLoad);
    17. }
    18. }

    Ok, wie dieser Fehler behebbar ist ist mir unklar.
    Anscheinend darfst Du nicht auf die Variable "Contents" zugreifen, weil diese nicht static ist (in VB: Shared).
    Du kannst das Problem möglicherweise umgehen, indem Du Dir die Variable Contents sparst und direkt einsetzt:

    Quellcode

    1. string[] SplittedContents = System.IO.File.ReadAllText(System.Environment.CurrentDirectory + "/" + "settings.txt", System.Text.Encoding.Default).Split('\n');


    Allerdings frage ich mich dann immer noch...

    Ach sooooooo!!!!!!!11111



    Du befindest Dich gar nicht in einer Ausführung!

    Quellcode

    1. public class splashscreen : MonoBehaviour {
    2. public float timer = 2f;
    3. public string levelToLoad = "menu";
    4. // Use this for initialization
    5. void Start () {
    6. }
    7. //Text auslesen und Splitten
    8. string Contents = System.IO.File.ReadAllText(System.Environment.CurrentDirectory + "/" + "settings.txt", System.Text.Encoding.Default);
    9. string[] SplittedContents = Contents.Split('\n');
    10. IEnumerator DisplayScene() {
    11. }
    12. }


    Merkst Du was?
    Das Problem ist hier ganz einfach, dass Du hier global (in einer Klasse) arbeitest, und nicht lokal (in einer Sub/Function).

    Du musst das Ganze umgestalten:

    Quellcode

    1. public class splashscreen : MonoBehaviour {
    2. String Irgendwas1;
    3. String Irgendwas2;
    4. // Use this for initialization
    5. void Start () {
    6. StartCoroutine("DisplayScene");
    7. String Contents = System.IO.File.ReadAllText("Pfad", System.Text.Encoding.Default);
    8. String[] SplittedContents = Contents.Split('Zeichen');
    9. Irgendwas1 = SplittedContents[0];
    10. Irgendwas2 = SplittedContents[1];
    11. }
    12. }


    So ähnlich!
    Das soll nur ein Ansatz sein.
    Suche Dir in

    void Start () {
    ...
    }

    Deine Einstellungen raus und speichere sie in globalen Variablen (so wie Irgendwas1 und Irgendwas2).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Jo danke, das ist genau das was ich gesucht habe :thumbsup:

    Jetzt sieht es aus wie mein vorheriger VB Code nur in C#

    Ich glaub ich werde mich wohl noch etwas mit C# beschäftigen müssen. Naja ich schau mal das ich mir wieder VC#.NET runterlade und damit ein kleines Projekt mache.
    Immerhin habe ich so auch VB gelernt.

    Naja aber zuerst mache ich noch die ganzen IF-Abfragen rein, das kann ich immerhin in C# schon. ;)
    Was ist der unterschied zwischen den folgenden 2 If-Abfragen (Außer die Sprache!)

    VB.NET-Quellcode

    1. If resolution = "1920 x 1080" Then
    2. Screen.SetResolution(1920, 1080, True)
    3. End If


    und

    Quellcode

    1. if (resolution == "1920 x 1080")
    2. Screen.SetResolution(1920, 1080, true);


    Ich weis ja nicht ob VB und C# wirklich so unterschiedlich sind, aber kann es sein das ich in C# keine strings in If-Abfragen packen kann?

    Unity will es überhaupt nicht akzeptieren.
    Ich kann auch nicht irgendwelche anderen If-Abfragen mit dem String machen, weil er einfach Ignoriert wird...
    Hier nochmal mein Code, habe ich schon wieder was falsch gemacht? 8|
    Also mein letzten Fehler mit den falschen Klassen habe ich auf jeden Fall nich.

    Spoiler anzeigen

    Quellcode

    1. using UnityEngine;
    2. using System.Collections;
    3. using System.IO;
    4. public class splashscreen : MonoBehaviour {
    5. public float timer = 2f;
    6. public string levelToLoad = "";
    7. public string resolution;
    8. public string graphic;
    9. public string sound;
    10. public string language;
    11. public string map;
    12. // Use this for initialization
    13. void Start () {
    14. StartCoroutine("DisplayScene");
    15. string Contents = System.IO.File.ReadAllText(System.Environment.CurrentDirectory + "/" + "settings.txt", System.Text.Encoding.Default);
    16. string[] SplittedContents = Contents.Split('\n');
    17. resolution = SplittedContents[1];
    18. graphic = SplittedContents[2];
    19. sound = SplittedContents[3];
    20. language = SplittedContents[4];
    21. map = SplittedContents[7];
    22. Settings();
    23. }
    24. IEnumerator DisplayScene() {
    25. yield return new WaitForSeconds(timer);
    26. Application.LoadLevel(levelToLoad);
    27. }
    28. public void Settings(){
    29. //Resolution
    30. if (resolution == "800 x 600"){
    31. Screen.SetResolution(800, 600, true);
    32. }
    33. if (resolution == "1920 x 1080"){
    34. Screen.SetResolution(1920, 1080, true);
    35. }
    36. }
    37. }



    Edit:

    Wenn ich print(resolution) verwende kommt jedoch 1920 x 1080 raus. Ich habe es auch mit Zahlen wie 1 versucht, aber es geht trotzdem nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tixewi“ ()

    Kommt eine Fehlermeldung? Wenn ja, welche?

    Oder kommt wieder der Murx mit den Static Variablen?


    Denn

    Quellcode

    1. string asdf = "bla";
    2. if (asdf == "bla")
    3. {
    4. MessageBox.Show("Passt!");
    5. }

    funktioniert problemlos.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Funktioniert einwandfrei 8|

    ---

    für die Resolution hat mir jemand in einem Unity Forum diese funktionierende Lösung geposted:

    Quellcode

    1. public string screen_wide;
    2. public string screen_height;
    3. Screen.SetResolution(int.Parse(screen_wide), int.Parse(screen_height), true);


    Das Problem ich kann das nicht auf die Map oder das Quality Level übertragen.
    Dieser Jemand hat das gut gelöst. So kann man nämlich auch andere Größen angeben.

    Du solltest in Deiner Ini die Breite und Höhe getrennt speichern.
    Dann kannst Du sie nämlich so auslesen:

    Quellcode

    1. screen_width = Convert.ToInt32(SplittedContents[?]);
    2. screen_height = Convert.ToInt32(SplittedContents[?]);

    Dazu gäbe es noch folgendes zu sagen:
    Convert.ToInt23() ist eine passable Methode.
    Das ? zwischen den [] soll den Index darstellen, an dem der entsprechende Wert liegt.
    Das englische Wort für "Breite" ist "width". "wide" bedeutet "breit".
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Also liefert Convert.ToInt32 und int.Parse das gleiche Ergebnis oder wie?

    Edit:

    Bei Convert.ToInt32 kommt: ...: error CS0103: The name `Convert' does not exist in the current context

    Edit: Edit:

    Ah ok, habs mal eben gegoogled und da wurde geschrieben, dass es eig nur ein Performance unterschied ist, da das eine schneller als das andere ist.
    Jup, liefert das gleiche.
    Aber wenn hier steht, dass die Convert Klasse nicht verfügbar ist, dann ist blöd (Du kannst mal probieren, ob es mit System.Convert.ToInt32() funktioniert, aber ich denke nicht, dass das einen Unterschied macht).
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils