Jump to content
Unity Insider Forum

Leeren des Eingabe Textes vom Input Field


Cyberpictures

Recommended Posts

Moinsen der Nervi vom Dienst ist wieder da ;)

 

Ich erweitere gerade mein Random Rechenscript, nun habe ich das Problem das ich den Text welcher die Eingabe in das InputField Rendert nicht gelöscht bekomme beim Script neu laden. 

Die Texte (NumberDisplay1 und number Display2) werden gelöscht und geleert beim Neustart. der Text (inputDisplay) jedoch nicht, was verstehe ich da falsch? Ich behandle den inputDisplay Text genauso wie die numerDisplay1 und 2 Texte. Wo ist dort mein Gedanken Fehler?

Kurze Anmerkung zum Script Code ich gebe mir mühe die Tipps von Random Berechnung Script Theard zu übernehmen, aber ich denke auch in der neuen Version sind noch Verbesserungen möglich.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class k1plus : MonoBehaviour
{

    public Canvas canvas;

    public GameObject showDice1;
    public GameObject showDice2;
    public GameObject scriptHolder;

    public Text answerDisplay;
    public Text numberDisplay1;
    public Text numberDisplay2;
    public Text mathCharacter;
    public Text inputDisplay;
    public Text result;
    public Text scoreDisplay;
    
    public InputField input;

    public Button send;

    public int scoreValue;

    public Sprite dice0;
    public Sprite dice1;
    public Sprite dice2;
    public Sprite dice3;
    public Sprite dice4;
    public Sprite dice5;

    private int number1;
    private int number2;
    private int score;

    private int[] Numbers = {1,2,3,4,5};
    private string[] characters = {"+"};
    

    private void Start()
    {
        reseteDisplays();
        numberGen();
        input = GameObject.Find("InputField").GetComponent<InputField>();
    }

    private void reseteDisplays()
    {
        inputDisplay.text = "";
        numberDisplay1.text = "";
        numberDisplay2.text = "";
    }

    private void numberGen()
    {
        number1 = Random.Range(0, 5);
        number2 = Random.Range(0, 5);

        string randCharacter = characters[Random.Range(0, characters.Length - 1)];

        switch (number1)
        {
            case 1:
                showDice1.GetComponent<Image>().sprite = dice1;
                break;

            case 2:
                showDice1.GetComponent<Image>().sprite = dice2;
                break;

            case 3:
                showDice1.GetComponent<Image>().sprite = dice3;
                break;

            case 4:
                showDice1.GetComponent<Image>().sprite = dice4;
                break;

            case 5:
                showDice1.GetComponent<Image>().sprite = dice5;
                break;

            default:
                showDice1.GetComponent<Image>().sprite = dice0;
                break;
        }

        switch (number2)
        {
            case 1:
                showDice2.GetComponent<Image>().sprite = dice1;
                break;

            case 2:
                showDice2.GetComponent<Image>().sprite = dice2;
                break;

            case 3:
                showDice2.GetComponent<Image>().sprite = dice3;
                break;

            case 4:
                showDice2.GetComponent<Image>().sprite = dice4;
                break;

            case 5:
                showDice2.GetComponent<Image>().sprite = dice5;
                break;

            default:
                showDice2.GetComponent<Image>().sprite = dice0;
                break;
        }

        // Stelle sicher, dass num1 größer ist als num2
        if (number2 > number1)
        {
            // Tausche die Werte der beiden Variablen
            var buffernumber = number1;
            var bufferdice = showDice1;

            number1 = number2;
            number2 = buffernumber;

            showDice1 = showDice2;
            showDice2 = bufferdice;

        }
        
        numberDisplay1.text += number1;
        numberDisplay2.text += number2;

        mathCharacter.text = randCharacter;
    }

    public void active()
    {
        //Button Prüfen Aktivieren erst wenn InputField etwas eingetragen wurde, vorher soll er inaktiv sein *Nächster Schritt*
    }
    
    public void calculation()
    {
        
        int count = int.Parse(result.text);
        int number1 = int.Parse(numberDisplay1.text);
        int number2 = int.Parse(numberDisplay2.text);
        int enter = int.Parse(input.text);
        
        //Das switch-case ist nichts anderes als eine Kurzform für Lauter if-Anweisungen hintereinander, die denselben Wert mit irgendetwas vergleichen.
        switch (mathCharacter.text)
        {
            case "+":
                count = number1 + number2;
                break;
            case "-":
                count = number1 - number2;
                break;
            case "*":
                count = number1 * number2;
                break;
            case "/":
                count = number1 / number2;
                break;
        }

        if (enter == count)
        {
            answerDisplay.text = "Klasse du bekommst 1 Stern das war Richtig";
            AddScore(scoreValue);
            Start();

        }
        else
        {
            answerDisplay.text = "Das war leider Falsch versuche es noch einmal";
            //Hier den Prüfbutton wieder deaktivieren bis neues Ergebniss eingetragen wurde und das eingabe feld resetet wurde
        }
    }

    private void AddScore(int newScoreValue)
    {
        score++;
        score += newScoreValue;
        UpdateScore();
    }

    void UpdateScore()
    {
        scoreDisplay.text = "Score: " + score;
    }
}

 

Nachtrag: mir ist entgangen zu erwähnen das ich nicht verstehe warum die showDice1 & 2 nicht mit sortiert werden nach den nummer1 & 2, wo ist da mein fehler ? 146496277_KeineSortierung.thumb.PNG.cfbbf63db10c7ee78ca4a9194d338a47.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey und willkommen! Ich würde zuerst empfehlen, das ganze Script einem Refactoring zu unterziehen - du kannst locker die Hälfte an Code Zeilen sparen. Meine Vermutung für den Fehler (habe jetzt nicht viel geschaut): ggf. ist der Inhalt noch im Input Feld und wird immer wieder neu ausgelesen, auch wenn er leer sein sollte? 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 4 Minuten schrieb Lars:

Hey und willkommen! Ich würde zuerst empfehlen, das ganze Script einem Refactoring zu unterziehen - du kannst locker die Hälfte an Code Zeilen sparen. Meine Vermutung für den Fehler (habe jetzt nicht viel geschaut): ggf. ist der Inhalt noch im Input Feld und wird immer wieder neu ausgelesen, auch wenn er leer sein sollte? 

was genau meinst du mit Refactoring ? ja ich weiß ist kein optimaler Code das kommt ich bin noch am Anfang beim Scripten und lerne immer mehr dazu dachte das ich schon wenig Code verwende 😮

vor 4 Minuten schrieb malzbie:

Ich weiß nicht, was dein Inputdisplay Text ist und wo du das Textelement beschreibst. Kann es sein, dass du den Text von deinem InputField ändern möchtest? Wenn ja, dann musste Input.Text nutzen.

Deine Vermutung war richtig Malzbie, ich habe immer versucht auf den text im Inputfield mit dem inputdisplay zuzugreifen danke, dann kann ich den Inputdisplay text ja aus dem Code nehmen. weißt du zufällig auch wo ran es liegt das die würfel sich nicht mit den zahlen zusammen sortieren ? das dachte ich mache ich in dem abschnitt.

 

// Stelle sicher, dass num1 größer ist als num2
        if (number2 > number1)
        {
            // Tausche die Werte der beiden Variablen
            var buffernumber = number1;
            var bufferdice = showDice1;

            number1 = number2;
            number2 = buffernumber;

            showDice1 = showDice2;
            showDice2 = bufferdice;

        }

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich kann das jetzt nicht genau sagen, aber evtl. liegt es daran, dass du das GameObject tauschen willst, anstatt das Sprite da drin.

Du machst schon ein wenig kompliziert und verwirrend. Es ist recht schwer für mich, durch den Code durchzusteigen.
Lass doch mal die Würfelsprites in Ruhe und sortier deine 2 Zahlen bevor du den Würfeln die entsprechenden Sprites zuweist. Denn dann ist die richtige Zahl schon an der richtige Stelle.

Außerdem würde ich an deiner Stelle einfach ein sechstelliges Array für die Sprites erzeugen und die Grafiken da rein schmeißen.

Z.B.:
 

public Sprite[] dices=new sprite[6]; // hier die würfelseiten rein tun
public Image showDice1; // Warum nicht gleich das Image deklarieren? Dann musst du nicht erst das Image mit getComponent holen
public Image showDice2;

// im code dann:
showDice1.sprite=dices[number1];
showDice2.sprite=dices[number2];

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 27 Minuten schrieb malzbie:

 


public Sprite[] dices=new sprite[6]; // hier die würfelseiten rein tun
public Image showDice1; // Warum nicht gleich das Image deklarieren? Dann musst du nicht erst das Image mit getComponent holen
public Image showDice2;

// im code dann:
showDice1.sprite=dices[number1];
showDice2.sprite=dices[number2];

 

der Tipp mit den Image direkt ansprechen und dem zahlen sortieren vorweg ist gut habe das nun um gebaut und es klappt danke schön, hast du einen Vorschlag wie ich den Code verständlicher schreiben kann ? oder meinst du mehr Kommentieren in dem Code ?

 

habe nun noch mal den Code hier mit deiner Modifikation die du vorgeschlagen hast und mehr Kommentaren.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class k1plus : MonoBehaviour
{

    public Canvas canvas;

    public Image showDice1;
    public Image showDice2;

    public GameObject scriptHolder;

    public Text answerDisplay;
    public Text numberDisplay1;
    public Text numberDisplay2;
    public Text mathCharacter;
    public Text result;
    public Text scoreDisplay;
    
    public InputField input;

    public Button check;

    public int scoreValue;
    public float timeOut;

    public Sprite[] dices = new Sprite[6];
   

    private int number1;
    private int number2;
    private int score;

    private int[] Numbers = {1,2,3,4,5};
    private string[] characters = {"+"};
    

    //Start, Leeren der Display felder und deaktivieren des Buttons
    public void Start()
    {
        resetDisplays();
        input = GameObject.Find("InputField").GetComponent<InputField>();
        check.GetComponent<Button>().enabled = false;
    }

    //resetDisplays, leert alle Displayfelder nach abschluß einer erfolgreichen Rechnung mit richtigem Ergebniss
    public void resetDisplays()
    {
        input.text = "";  //leert das Inputfeld
        numberDisplay1.text = ""; //leert das Feld für Nummer1
        numberDisplay2.text = ""; //leert das Feld für Nummer2
        answerDisplay.text = ""; //leert das Antworten Feld
        check.GetComponent<Button>().enabled = false; //deaktiviert den PrüfButton
        numberGen(); //generiert die Nummer1 und Nummer2 neu
    }

    //numberGen, generiert zufällig zahlen von 0 - 5 welche dann im Textfeld angezeigt werden mit dem dazu gehörigem Bild
    public void numberGen()
    {
        number1 = Random.Range(0, 5);
        number2 = Random.Range(0, 5);

        string randCharacter = characters[Random.Range(0, characters.Length - 1)];

        // Stelle sicher, dass num1 größer ist als num2
        if (number2 > number1)
        {
            // Tausche die Werte der beiden Variablen 
            var buffernumber = number1;
            var bufferdice = showDice1;

            number1 = number2;
            number2 = buffernumber;
        }
        
        numberDisplay1.text += number1;
        numberDisplay2.text += number2;

        showDice1.sprite = dices[number1];
        showDice2.sprite = dices[number2];

        mathCharacter.text = randCharacter;
    }

    //active, hier soll der Button Prüfen aktiviert werden *funktion wird mit dem Bool im Inspector ausgeführt* wenn im InputField etwas eingetragen wird
    public void active()
    {
        //Button Prüfen Aktivieren erst wenn InputField etwas eingetragen wurde, vorher soll er inaktiv sein *Nächster Schritt*
        check.GetComponent<Button>().enabled = true;
    }
    
    //calculation, hier wird die erstellte Aufgabe berechnet und das Ergebniss des Scriptes mit der Eingabe des Spieler abgeglichen
    public void calculation()
    {
        
        int count = int.Parse(result.text);
        int number1 = int.Parse(numberDisplay1.text);
        int number2 = int.Parse(numberDisplay2.text);
        int enter = int.Parse(input.text);
        
        //Das switch-case steuert die einzelnen Rechenarten (derzeit nur Plus)
        switch (mathCharacter.text)
        {
            case "+":
                count = number1 + number2;
                break;
            case "-":
                count = number1 - number2;
                break;
            case "*":
                count = number1 * number2;
                break;
            case "/":
                count = number1 / number2;
                break;
        }

        //Bei Richtiger Eingabe ins Inputfield, schreibt es den answerDisplay Text, erteilt dem Spieler 1 Stern(addscore) und startet die wartezeit bis zum resetDisplays 
        if (enter == count)
        {
            answerDisplay.text = "Klasse du bekommst 1 Stern das war Richtig";
            AddScore(scoreValue);
            StartCoroutine(sleepTime(timeOut));

        }

        //Bei Falscher Eingabe ins Inputfield, schreibt es den answerDisplay Text, erteilt dem Spieler 0 Stern und startet die wartezeit bis zum resetDisplays
        else
        {
            answerDisplay.text = "Das war leider Falsch versuche es noch einmal";
            StartCoroutine(sleepTime(timeOut));
        }
    }

    //fügt den aktuellen Sternen einen neuen hinzu wenn die Antwort richtig war
    public void AddScore(int newScoreValue)
    {
        score++;
        score += newScoreValue;
        UpdateScore();
    }

    //aktuallisiert den ScoreDisplay Text auf neuen Stand der Sterne
    void UpdateScore()
    {
        scoreDisplay.text ="" + score;
    }

    // deaktiviert den Prüfbutton und startet eine neue Runde mit neuen Zahlen
    IEnumerator sleepTime(float timeOut)
    {
        check.GetComponent<Button>().enabled = false;
        yield return new WaitForSeconds(timeOut);
        resetDisplays();
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Hauptdingen waren die zwei Switch-Case Bereiche für die Würfelseiten. Die sind ja nun weg. :)
Auch das GetComponent nicht mehr da.

Dass du deine Methoden mit Kommentaren versehen hast, ist gut. Das hilft, weil man jetzt schneller erkennen kann, was du da machst.
Die Anderen Dinge, die klar sind, musst du nicht unbedingt kommentieren. Aber wenn es dir hilft, dann mach ruhig.

Was jetzt noch gemacht werden sollte:
Aus

var buffernumber = number1; 

machste

int buffernumber=number1;

Das hilft ungemein zu erkennen um was für einen Typ es sich handelt.

var bufferdice = showDice1;

kannst und solltest du löschen. Codeleichen immer gleich weg machen.

Ansonsten ist das schon alles ok. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Cyberpictures:

was genau meinst du mit Refactoring ? ja ich weiß ist kein optimaler Code das kommt ich bin noch am Anfang beim Scripten und lerne immer mehr dazu dachte das ich schon wenig Code verwende 😮

 

Kein Ding, was ich damit meine ist, den Code zu optimieren. Die Switches z.B. sind sehr groß und lassen sich auf ein Minimum reduzieren. Aber das ist für später. Mehr dazu z.B. hier: https://refactoring.guru/refactoring

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 47 Minuten schrieb malzbie:

Das hilft ungemein zu erkennen um was für einen Typ es sich handelt.

Ich benutze fast überall var. Ich würde behaupten wollen, dass es für die Lesbarkeit (Typ sofort erkennen) auch nur einen Unterschied macht, wenn man schlechte Variablennamen wählt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja für einen selbst ist das ok. Aber wenn ich einen Fehler im Code finden soll und nicht weiß um welchen Typ es sich handelt, scoll ich erstmal ganz nach oben wo die anderen Variablen deklariert sind. Aber das ist nur ne Kleinigkeit und vielleicht auch nur eine Vorliebe von mir.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe einen Fehler gefunden wo ich gerade keine passende Lösung finde, wenn ich eine Aufgabe rechne und auf prüfen klicke soll ja der Button deaktiviert werden, und erst wieder aktiviert werden wenn nach richtigem Ergebnis zeit x abgelaufen ist und eine neue Aufgabe da steht sowie ein Eintrag in das Inputfield gemacht wurde.

 

Problem ist, das wenn ich eine Aufgabe richtig löse und ich dann mehr mal in der zeit x wo mein answerText kommt und eine neue Aufgabe generiert wird, auf Prüfen klicken der Button Aktiv ist und jedes klicken ein Stern zufügt da das Ergebnis ja noch immer richtig ist im Eingabe Feld. 

 

//Bei Richtiger Eingabe ins Inputfield, schreibt es den answerDisplay Text, erteilt dem Spieler 1 Stern(addscore) und startet die wartezeit bis zum resetDisplays 
        if (enter == count)
        {
            answerDisplay.text = "Klasse du bekommst 1 Stern das war Richtig";
            AddScore(scoreValue);
            StartCoroutine(sleepTime(timeOut));

        }

oder bei einer falschen Antwort nach einer zeit x wieder eine Eingabe in das Eingabefeld gemacht wird.

//Bei Falscher Eingabe ins Inputfield, schreibt es den answerDisplay Text, erteilt dem Spieler 0 Stern und startet die wartezeit bis zum resetDisplays
        else
        {
            answerDisplay.text = "Das war leider Falsch versuche es noch einmal";
            StartCoroutine(sleepTimefalse(timeOut));
        }

und so sieht der sleeptimer aus

// deaktiviert den Prüfbutton und startet eine neue Runde mit neuen Zahlen
    IEnumerator sleepTime(float timeOut)
    {
        check.GetComponent<Button>().enabled = false;
        yield return new WaitForSeconds(timeOut);
        resetDisplays();
    }

// deaktiviert den Prüfbutton leert das InputField und leert wieder den AnswerText
    IEnumerator sleepTimefalse(float timeOut)
    {
        check.GetComponent<Button>().enabled = false;
        input.text = "";
        check.GetComponent<Button>().enabled = false;
        yield return new WaitForSeconds(timeOut);
    }

was mache ich falsch? 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...