Jump to content
Unity Insider Forum

Variablen verlieren, vergesen ihren Wert


Unity54

Recommended Posts

In einem Matheprogramm, das Plus und minus Aufgaben erstellt gibt es folgende Problematik:

ich inizialisiere 3 Variablen

public int a1,b1,c1;

generiere 2 Zahlen:

a1 = Random.Range(2,9)

b1 = Random.Range(2,9)

die Lösung ist somit

c1 = a1 + b1

In ein InputField auf der Scene wird die Lösung eingegeben und mit Enter abgeschlossen

dann geht es in die Überprüfung, wo die Problematik auftritt, dass c1 plötzlich 0 ist!

(zu Aufgabendarstellung werden a1 und b1 in strings umgewandelt - KANN DAS DAS PROBLEM SEIN?)

public void kontrolle()

eingabe = int.Parse(TextField.text);

if (eingabe == c1)

dann richtig …..

else

falsch ….

Bei den Minusaufgaben nehme ich a1(5) und a2 (3), zähle sie zusammen c1 = (8)

dann erstelle ich die Aufgabe c1 (8) - a2 (3) =

Die Lösung ist somit a1( also die (5)

Bei der Überprüfung der Lösung ist a1 aber wieder o statt  eben 5

Für mich ein unerklärliches Phänomen

Klappt die Umwandlung mit int.Parse nicht richtig oder was zum Teufel spuckt da?

Danke zum voraus für gute Tipps

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie gewünscht hier der Code PLUS

Hier der Code Minus
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Minus : MonoBehaviour
{   public GameObject Panel1,Panel2,Panel3,Panel4,Panel5,Panel6,Panel7,Panel8,Panel9;
    public InputField ein1, ein2, ein3, ein4, ein5, ein6,ein7,ein8,ein9;
    public int a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4,c4,a5,b5,c5,a6,b6,c6,a7,b7,c7,a8,b8,c8,a9,b9,c9;
    public string antw1;
    public Text txt;
    string eingabe;
    int aloesung;
    int cloesung;
    int s;
    public AudioSource source;
    public void Start()
    {
       
    }
    public void minusaufgaben()
    {
        //Panels show
        Panel1.gameObject.SetActive (true);
        Panel2.gameObject.SetActive (true);
        Panel3.gameObject.SetActive (true);
        Panel4.gameObject.SetActive (true);
        Panel5.gameObject.SetActive (true);
        Panel6.gameObject.SetActive (true);
        Panel7.gameObject.SetActive (true);
        Panel8.gameObject.SetActive (true);
        Panel9.gameObject.SetActive (true);

         a1 = Random.Range(2,9);
         antw1 = a1.ToString();
         b1 = Random.Range(2,9);
        c1 = a1 + b1;
         txt = GameObject.Find("Aufg1").GetComponent<Text>();
         txt.text= c1.ToString() +" - "+ b1.ToString()+" =";

         a2 = Random.Range(2,9);
         b2 = Random.Range(2,9);
        c2 = a2 + b2;
         txt = GameObject.Find("Aufg2").GetComponent<Text>();
         txt.text= c2.ToString() +" - "+ b2.ToString()+" =";

         a3 = Random.Range(2,9);
         b3 = Random.Range(2,9);
        c3 = a3 + b3;
         txt = GameObject.Find("Aufg3").GetComponent<Text>();
         txt.text= c3.ToString() +" - "+ b3.ToString()+" =";

         a4 = Random.Range(2,9);
         b4 = Random.Range(2,9);
        c4 = a4 + b4;
         txt = GameObject.Find("Aufg4").GetComponent<Text>();
         txt.text= c4.ToString() +" - "+ b4.ToString()+" =";

         a5 = Random.Range(2,9);
         b5 = Random.Range(2,9);
        c5 = a5 + b5;
         txt = GameObject.Find("Aufg5").GetComponent<Text>();
         txt.text= c5.ToString() +" - "+ b5.ToString()+" =";

         a6 = Random.Range(2,9);
         b6 = Random.Range(2,9);
        c6 = a6 + b6;
         txt = GameObject.Find("Aufg6").GetComponent<Text>();
         txt.text= c6.ToString() +" - "+ b6.ToString()+" =";

         a7 = Random.Range(2,9);
         b7 = Random.Range(2,9);
        c7 = a7 + b7;
         txt = GameObject.Find("Aufg7").GetComponent<Text>();
         txt.text= c7.ToString() +" - "+ b7.ToString()+" =";

         a8 = Random.Range(2,9);
         b8 = Random.Range(2,9);
        c8 = a8 + b8;
         txt = GameObject.Find("Aufg8").GetComponent<Text>();
         txt.text= c8.ToString() +" - "+ b8.ToString()+" =";

         a9 = Random.Range(2,9);
         b9 = Random.Range(2,9);
        c9 = a9 + b9;
         txt = GameObject.Find("Aufg9").GetComponent<Text>();
         txt.text= c9.ToString() +" - "+ b9.ToString()+" =";
    }
    public void kont1()
    {   
        
        aloesung = int.Parse(ein1.text);
        
        if (aloesung == a1+b1-a1)
        {  
            ein1.enabled = false;
            Panel1.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein1.text = "";
            ein1.ActivateInputField ();
            ein1.Select ();
            falsch();
        }
    }
    
    public void kont2()
    {
        aloesung = int.Parse(ein2.text);
        cloesung = int.Parse(antw1);
        if (aloesung == cloesung)
        {  
            ein2.enabled = false;
            Panel2.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein2.text = "";
            ein2.ActivateInputField ();
            ein2.Select ();
            falsch();
        }
    }
    public void kont3()
    {
        aloesung = int.Parse(ein3.text);
        if (aloesung == a3+b3)
        {  
            ein3.enabled = false;
            Panel3.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein3.text = "";
            ein3.ActivateInputField ();
            ein3.Select ();
            falsch();
        }
    }
    public void kont4()
    {
        aloesung = int.Parse(ein4.text);
        if (aloesung == a4+b4)
        {  
            ein4.enabled = false;
            Panel4.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein4.text = "";
            ein4.ActivateInputField ();
            ein4.Select ();
            falsch();
        }
    }
    public void kont5()
    {
        aloesung = int.Parse(ein5.text);
        if (aloesung == a5+b5)
        {  
            ein5.enabled = false;
            Panel5.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein5.text = "";
            ein5.ActivateInputField ();
            ein5.Select ();
            falsch();
        }
    }
    public void kont6()
    {
        aloesung = int.Parse(ein6.text);
        if (aloesung == a6+b6)
        {  
            ein6.enabled = false;
            Panel6.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein6.text = "";
            ein6.ActivateInputField ();
            ein6.Select ();
            falsch();
        }
    }
    public void kont7()
    {
        aloesung = int.Parse(ein7.text);
        if (aloesung == a7+b7)
        {  
            ein7.enabled = false;
            Panel7.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein7.text = "";
            ein7.ActivateInputField ();
            ein7.Select ();
            falsch();
        }
    }
    public void kont8()
    {
        aloesung = int.Parse(ein8.text);
        if (aloesung == a8+b8)
        {  
            ein8.enabled = false;
            Panel8.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein8.text = "";
            ein8.ActivateInputField ();
            ein8.Select ();
            falsch();
        }
    }
    public void kont9()
    {
        aloesung = int.Parse(ein9.text);
        if (aloesung == a9+b9)
        {  
            ein9.enabled = false;
            Panel9.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein9.text = "";
            ein9.ActivateInputField ();
            ein9.Select ();
            falsch();
        }
    }
    public void richtig()
    {
        s = Random.Range(1,7);
        switch (s)
        {
        case 1:
        SoundManagerScript.PlaySound ("L1");
        break;
        case 2:
        SoundManagerScript.PlaySound ("L2");
        break;
        case 3:
        SoundManagerScript.PlaySound ("L3");
        break;
        case 4:
        SoundManagerScript.PlaySound ("L4");
        break;
        case 5:
        SoundManagerScript.PlaySound ("L5");
        break;
        case 6:
        SoundManagerScript.PlaySound ("L6");
        break;
        case 7:
        SoundManagerScript.PlaySound ("L7");
        break;
        }
        //txt = GameObject.Find("Info").GetComponent<Text>();
        //txt.text = "Deine Antwort ist richtig!";
        //StartCoroutine (Warte(2f)); 
    }
    public void falsch()
    {
        SoundManagerScript.PlaySound ("falsch");
        //txt = GameObject.Find("Info").GetComponent<Text>();
        //txt.text = "Deine Antwort ist falsch!";
        //StartCoroutine (Warte(2f));
    }

    private IEnumerator Warte (float zeit)
    {
        yield return new WaitForSeconds(zeit);
        Infloeschen();
    }

    private void Infloeschen()
    {
        //txt = GameObject.Find("Info").GetComponent<Text>();
        //txt.text = ""; 
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

:

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

public class Plus : MonoBehaviour
{   
    public int zufall;
    private Sprite euleSprite,leopardSprite,memoSprite,pinguineSprite,tigerbabySprite,waleSprite;
    public GameObject Panel1,Panel2,Panel3,Panel4,Panel5,Panel6,Panel7,Panel8,Panel9;
    public InputField ein1, ein2, ein3, ein4, ein5, ein6,ein7,ein8,ein9;
    public int a1,b1,a2,b2,a3,b3,a4,b4,a5,b5,a6,b6,a7,b7,a8,b8,a9,b9;
    public Text txt;
    string eingabe;
    int aloesung;
    int cloesung;
    int s;
    public AudioSource source;
    public void Start()
    {
        zufall = Random.Range (1,6);
        Debug.Log("zufall " + zufall);

        euleSprite = Resources.Load<Sprite>("Eule");
        leopardSprite = Resources.Load<Sprite>("Leopard");
        memoSprite = Resources.Load<Sprite>("Memo");
        pinguineSprite = Resources.Load<Sprite>("Pinguine");
        tigerbabySprite = Resources.Load<Sprite>("Tigerbaby");
        waleSprite = Resources.Load<Sprite>("Wale");
		Bildwahl ();
    }
    public void Bildwahl()
    {
        switch (zufall)
		{
		case 1:
			GameObject.Find ("B1").GetComponent<SpriteRenderer> ().sprite = euleSprite;
			break;
		case 2:
			GameObject.Find ("B1").GetComponent<SpriteRenderer> ().sprite = leopardSprite;
			break;
		case 3:
			GameObject.Find ("B1").GetComponent<SpriteRenderer> ().sprite = memoSprite;
			break;
		case 4:
			GameObject.Find ("B1").GetComponent<SpriteRenderer> ().sprite = pinguineSprite;
			break;
		case 5:
			GameObject.Find ("B1").GetComponent<SpriteRenderer> ().sprite = tigerbabySprite;
			break;
		case 6:
			GameObject.Find ("B1").GetComponent<SpriteRenderer> ().sprite = waleSprite;
			break;
		}
        plusaufgaben();
    }

    public void plusaufgaben()
    {
        //Bildwahl();
        //Panels show
        Panel1.gameObject.SetActive (true);
        Panel2.gameObject.SetActive (true);
        Panel3.gameObject.SetActive (true);
        Panel4.gameObject.SetActive (true);
        Panel5.gameObject.SetActive (true);
        Panel6.gameObject.SetActive (true);
        Panel7.gameObject.SetActive (true);
        Panel8.gameObject.SetActive (true);
        Panel9.gameObject.SetActive (true);

         a1 = Random.Range(2,9);
         b1 = Random.Range(2,9);

         txt = GameObject.Find("Aufg1").GetComponent<Text>();
         txt.text= a1.ToString() +" + "+ b1.ToString()+" =";

         a2 = Random.Range(2,9);
         b2 = Random.Range(2,9);

         txt = GameObject.Find("Aufg2").GetComponent<Text>();
         txt.text= a2.ToString() +" + "+ b2.ToString()+" =";

         a3 = Random.Range(2,9);
         b3 = Random.Range(2,9);

         txt = GameObject.Find("Aufg3").GetComponent<Text>();
         txt.text= a3.ToString() +" + "+ b3.ToString()+" =";

         a4 = Random.Range(2,9);
         b4 = Random.Range(2,9);

         txt = GameObject.Find("Aufg4").GetComponent<Text>();
         txt.text= a4.ToString() +" + "+ b4.ToString()+" =";

         a5 = Random.Range(2,9);
         b5 = Random.Range(2,9);

         txt = GameObject.Find("Aufg5").GetComponent<Text>();
         txt.text= a5.ToString() +" + "+ b5.ToString()+" =";

         a6 = Random.Range(2,9);
         b6 = Random.Range(2,9);

         txt = GameObject.Find("Aufg6").GetComponent<Text>();
         txt.text= a6.ToString() +" + "+ b6.ToString()+" =";

         a7 = Random.Range(2,9);
         b7 = Random.Range(2,9);

         txt = GameObject.Find("Aufg7").GetComponent<Text>();
         txt.text= a7.ToString() +" + "+ b7.ToString()+" =";

         a8 = Random.Range(2,9);
         b8 = Random.Range(2,9);

         txt = GameObject.Find("Aufg8").GetComponent<Text>();
         txt.text= a8.ToString() +" + "+ b8.ToString()+" =";

         a9 = Random.Range(2,9);
         b9 = Random.Range(2,9);

         txt = GameObject.Find("Aufg9").GetComponent<Text>();
         txt.text= a9.ToString() +" + "+ b9.ToString()+" =";
    }
    public void kont1()
    {
        aloesung = int.Parse(ein1.text);

        if (aloesung == a1+b1)
        {  
            ein1.enabled = false;
            Panel1.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein1.text = "";
            ein1.ActivateInputField ();
            ein1.Select ();
            falsch();
        }
    }
    
    public void kont2()
    {
        aloesung = int.Parse(ein2.text);
        if (aloesung == a2+b2)
        {  
            ein2.enabled = false;
            Panel2.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein2.text = "";
            ein2.ActivateInputField ();
            ein2.Select ();
            falsch();
        }
    }
    public void kont3()
    {
        aloesung = int.Parse(ein3.text);
        if (aloesung == a3+b3)
        {  
            ein3.enabled = false;
            Panel3.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein3.text = "";
            ein3.ActivateInputField ();
            ein3.Select ();
            falsch();
        }
    }
    public void kont4()
    {
        aloesung = int.Parse(ein4.text);
        if (aloesung == a4+b4)
        {  
            ein4.enabled = false;
            Panel4.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein4.text = "";
            ein4.ActivateInputField ();
            ein4.Select ();
            falsch();
        }
    }
    public void kont5()
    {
        aloesung = int.Parse(ein5.text);
        if (aloesung == a5+b5)
        {  
            ein5.enabled = false;
            Panel5.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein5.text = "";
            ein5.ActivateInputField ();
            ein5.Select ();
            falsch();
        }
    }
    public void kont6()
    {
        aloesung = int.Parse(ein6.text);
        if (aloesung == a6+b6)
        {  
            ein6.enabled = false;
            Panel6.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein6.text = "";
            ein6.ActivateInputField ();
            ein6.Select ();
            falsch();
        }
    }
    public void kont7()
    {
        aloesung = int.Parse(ein7.text);
        if (aloesung == a7+b7)
        {  
            ein7.enabled = false;
            Panel7.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein7.text = "";
            ein7.ActivateInputField ();
            ein7.Select ();
            falsch();
        }
    }
    public void kont8()
    {
        aloesung = int.Parse(ein8.text);
        if (aloesung == a8+b8)
        {  
            ein8.enabled = false;
            Panel8.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein8.text = "";
            ein8.ActivateInputField ();
            ein8.Select ();
            falsch();
        }
    }
    public void kont9()
    {
        aloesung = int.Parse(ein9.text);
        if (aloesung == a9+b9)
        {  
            ein9.enabled = false;
            Panel9.gameObject.SetActive (false);
            richtig();
        }
        else
        {
            ein9.text = "";
            ein9.ActivateInputField ();
            ein9.Select ();
            falsch();
        }
    }
    public void richtig()
    {
        s = Random.Range(1,7);
        switch (s)
        {
        case 1:
        SoundManagerScript.PlaySound ("L1");
        break;
        case 2:
        SoundManagerScript.PlaySound ("L2");
        break;
        case 3:
        SoundManagerScript.PlaySound ("L3");
        break;
        case 4:
        SoundManagerScript.PlaySound ("L4");
        break;
        case 5:
        SoundManagerScript.PlaySound ("L5");
        break;
        case 6:
        SoundManagerScript.PlaySound ("L6");
        break;
        case 7:
        SoundManagerScript.PlaySound ("L7");
        break;
        }
        //txt = GameObject.Find("Info").GetComponent<Text>();
        //txt.text = "Deine Antwort ist richtig!";
        //StartCoroutine (Warte(2f)); 
    }
    public void falsch()
    {
        SoundManagerScript.PlaySound ("falsch");
        //txt = GameObject.Find("Info").GetComponent<Text>();
        //txt.text = "Deine Antwort ist falsch!";
        //StartCoroutine (Warte(2f));
    }

    private IEnumerator Warte (float zeit)
    {
        yield return new WaitForSeconds(zeit);
        Infloeschen();
    }

    private void Infloeschen()
    {
        //txt = GameObject.Find("Info").GetComponent<Text>();
        //txt.text = ""; 
    }
    // Update is called once per frame
    void Update()
    {
        
    }

}

Die Bugs sind in den voids (Richtigkeit prüfen)  kont1 bis kont9

Die Variable cloesung (Computerlösung) ist immer wieder 0; statt der richtigen Lösung, die ich zu Beginn ausrechne!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Uff, das sind vielleicht Bretter. Du solltest den Code dringend aufräumen, dann findet man darin auch die Fehler.

Ganz zu Anfang... mit Ausnahme von der Implementation irgendeiner abstrakten Algorithmik machst du grundsätzlich etwas falsch, wenn du zwei oder mehr Dinge hast, die gleich heißen mit Ausnahme der Nummer am Ende. Entsprechend sind switch-case-Blöcke in 5% der Fälle sinnvoll, in allen anderen einfach nur ein Zeichen für schlechten Code. Redundanz in Code ist grundsätzlich zu vermeiden.

So als Beispiel:

public GameObject Panel1,Panel2,Panel3,Panel4,Panel5,Panel6,Panel7,Panel8,Panel9;

Daraus machst du ganz einfach:

public GameObject[] Panels;

Das ist ein Array und da kannst du im Editor genau wie vorher mehrere gleichartige Elemente reinziehen. Zugriff erfolgt mit einem Index in den eckigen Klammern:

Panels[0] = irgendeinPanel;
irgendeinPanel = Panels[1];
Panels[2].MachZeugs();

Da du kein Literal benutzen musst, sondern auch ein Ausdruck (wie eine int-Variable) in die Klammern eingesetzt werden kann, kannst du eine Schleife bauen. Zusammen mit ".Length" zum Abfragen der Anzahl der Elemente wird aus

Panel1.gameObject.SetActive (true);
Panel2.gameObject.SetActive (true);
Panel3.gameObject.SetActive (true);
Panel4.gameObject.SetActive (true);
Panel5.gameObject.SetActive (true);
Panel6.gameObject.SetActive (true);
Panel7.gameObject.SetActive (true);
Panel8.gameObject.SetActive (true);
Panel9.gameObject.SetActive (true);

ein ganz simples

for (var i = 0; i < Panels.Length; i++)
{
  Panels[i].SetActive(true);
}

(das ".gameObject" brauchst du nicht, ist ja schon das GameObject).

Du kannst das auch so machen:

foreach (var panel in Panels)
{
  panel.SetActive(true);
}

Abgesehen davon, dass das nur ein Bruchteil der Zeilen ist, ist das ganze jetzt erweiterbar: Wenn du mal ein Panel hinzufügst oder wegnimmst, musst du diese Code-Stelle nicht mehr ändern. Da du aktuell etwa ein Dutzend solcher Stellen hast, musst du bei jeder Änderung auch ein Dutzend Codestellen ändern. Jeder dieser Schritte kann vergessen oder falsch gemacht werden, und dadurch entstehen Fehler.

Genauso deine Methoden, die alle exakt dasselbe machen, nur mit anderen Objekten. Die kommen bitte alle weg und es bleibt immer jeweils nur noch eine einzige Methode.

Zum Beispiel

public void kont1()
{
  aloesung = int.Parse(ein1.text);

  if (aloesung == a1+b1)
  {  
    ein1.enabled = false;
    Panel1.gameObject.SetActive (false);
    richtig();
  }
  else
  {
    ein1.text = "";
    ein1.ActivateInputField ();
    ein1.Select ();
    falsch();
  }
}

Da du deine Panels (und bitte auch alles andere) in Arrays packst, kannst du mit einem Index arbeiten, der der Methode übergeben wird:

public void kont(int index)
{
  aloesung = int.Parse(ein[index].text);

  if (aloesung == a1+b1)
  {  
    ein[index].enabled = false;
    Panels[index].SetActive(false);
    richtig();
  }
  else
  {
    ein[index].text = "";
    ein[index].ActivateInputField();
    ein[index].Select();
    falsch();
  }
}

und statt

kont1();

rufst du dann

kont(1);

auf. Das ganze geht dann immer weiter - zum Beispiel machen deine beiden Klassen Plus und Minus auch wieder exakt dasselbe - nur mit einem anderen Rechenoperator. Den gesamten Code zweimal zu haben ist wieder eine dicke potentielle Fehlerquelle. Wenn du das auf eine Klasse reduzierst, hast du sogar eine Situation, in der ein switch-case in Ordnung wäre :)

Dann nochmal überlegen, ob du nicht etwas öfter lokale Variablen benutzen willst. Ständig die Zwischenergebnisse irgendwelcher methodeninternen Kalkulationen in den permanenten Objektzustand zu schreiben kann auch gerne Mal zu Fehlern führen.

Wenn du deinen gesamten Code auf diese Weise aufgeräumt hast, dann solltest du am Ende nur noch irgendwas zwischen 20 und 30 Zeilen Code haben. Mit allem drum und dran. Und wenn du nur noch so wenig Code hast, dann wirst du den/die Fehler vermutlich sogar ganz schnell selber finden. Wenn ich mir das so ansehe, dann vermutlich sogar schon während des Aufräumens.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Sascha

Vorweg herzlichen Dank für deine Rückmeldung und die wertvollen Tipps.

Ich habe versucht die "Bretter" aufzuräumen!

GameObjecte in Arrays gepackt und mit Schleifen die Panels und Aufgaben erstellt.

Nun bin ich bei den InputFields stecken geblieben, das mit dem Index ist mir nicht verständlich.

Der Sachverhalt ist ja so:  in der Szene sind 9 Panels, in diesen als Kind je ein Text und ein InputField.

Wie kann man, wenn der Anwender die Eingabe mit Enter schliesst zur void Kontrolle springen,

besser gefragt wie kann der Index des InputFields mitgegeben werde?, damit ich im Script weiss,

um welches InputFiled es sich handelt!

Zur Erinnerung - Es geht um diese void:

public void kont(int index)
{
  aloesung = int.Parse(ein[index].text);

  if (aloesung == a1+b1)
  {  
    ein[index].enabled = false;
    Panels[index].SetActive(false);
    richtig();
  }
  else
  {
    ein[index].text = "";
    ein[index].ActivateInputField();
    ein[index].Select();
    falsch();
  }
}
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Minuten schrieb Unity54:

Ich habe versucht die "Bretter" aufzuräumen!

GameObjecte in Arrays gepackt und mit Schleifen die Panels und Aufgaben erstellt.

Top!

vor 9 Minuten schrieb Unity54:

wie kann der Index des InputFields mitgegeben werde?

Man braucht ja nicht einmal unbedingt Indizes für solche Dinge. Denn die eigentliche Frage ist ja:

vor 9 Minuten schrieb Unity54:

damit ich im Script weiss,

um welches InputFiled es sich handelt!

Warum also mit einem Index arbeiten, wenn du auch direkt eine Referenz zum Input-Feld hin- und herschieben kannst. Stell dir vor, du stehst mit einem Kumpel vor einem Parkplatz mit 1000 Plätzen und sagst "Ich mag das Auto auf Platz 739", anstatt einfach mit dem Finger darauf zu zeigen :)

Bauen wir mal was simples: Einen Zähler mit Knopf. Das ist ein Textfeld und wenn der Knopf gedrückt wird, wird der Zähler um 1 erhöht.

Dafür nehmen wir eine simple Klasse:

[RequireComponent(typeof(Text))]
public class Counter : MonoBehaviour
{
  private Text text;
  private int number = 0;
  
  
  private void Awake()
  {
    text = GetComponent<Text>();
  }
  
  public void Increment()
  {
    number++;
    text.text = number + "";
  }
}

Das Ding packst du auf den Text. Dann gehst du zum Button und fügst eine Zeile im On Click-Event hinzu. Da ziehst du das Textfeld rein und wählst dann im Dropdown-Menü Counter > Increment aus.

Jetzt funktioniert der Zähler. Als nächstes kannst du das ganze Ding (Button + Text, bzw. deren gemeinsamen Parent, wenn es einen gibt) markieren und duplizieren. Du wirst feststellen, dass du jetzt mehrere Zähler hast, die alle unabhängig voneinander funktionieren. Und das ganz ohne zentrales Managerscript, das von allen Dingen die dazugehörigen anderen Dinge kennt. Das ist so der Unterschied zwischen "jeden morgen kommen die Büroangestellten zur Arbeit und schauen im Foyer im dicken Buch nach, wo ihr Schreibtisch steht" und "jeder Angestellte weiß einfach selbst, wo sein Schreibtisch steht".

Jeder Button referenziert einfach direkt den Counter, den er ansprechen soll, und jede Counter-Komponente referenziert direkt das eine Textfeld, in das sie schreibt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe nun doch entschieden meine Inputfields in eine Array zu packen, was ,ir auch gelungen ist.

Ich weiss jetzt auch durch die index-Übergabe, welches InputField abgeschlossen ist.

Probleme macht das Parser des InbutField in integer, damit ich es weiter auf Richtigkeit prüfen kann.

Eine Methode, die ich immer häufiger gebrauchen würde!

Zum Studium hänge ich meine Kontroll void an, danke für deine Tipps!

public InputField [] input;
public GameObject inputField0,inputField1,inputField2,inputField3,inputField4,inputField5,inputField6,inputField7,inputField8;
 
public void KontrollNr(int index)
 
{
Debug.Log("Es handelt sich um Eingabe: " + index);
Debug.Log("Die richtige Antwort lautet: " + antwort[index]);
 
/////// Inputtext abfragen
///FEHLERMELDUNG in den 3 folgenden Zeilen ***********
input[index]= GameObject.Find("InputField[index]").GetComponent<InputField>();
 
schLoesung[index] = int.Parse(input[index].GetComponent<Text>().text);
 
Debug.Log("Die Schülerlösung lautet: " + schLoesung[index]);
 
}
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Unity54:

ch habe nun doch entschieden meine Inputfields in eine Array zu packen, was ,ir auch gelungen ist.

Täte ich ja lassen, dann würde sich auch dein aktuelles Problem in Luft auflösen ;)

Mal ganz davon abgesehen, dass da wieder NEUN quasi gleichnamige Variablen sind.

Aber der Vollständigkeit halber... "InputField[index]" ist ein String-Literal in dem steht: "InputField[index]". Wenn du "InputField[4]" haben willst, aber die 4 halt durch den Zahlenwert der Variable "index" ersetzt wird, dann musst du das auch schreiben. Simple Variante ohne Syntaxzucker wäre

"InputField[" + index + "]"

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...