Jump to content
Unity Insider Forum
Sir_Mathew

Text vom Button ändern

Recommended Posts

Hi,

ich werde noch irre.

Man kann ja auf Komponenten zugreifen, naja klappt NULL.

Ich möchte auf mein Button Forward_Walk auf das text Objekt Forward_Walk auf die Text Komponente zugreifen um "Forward Walk =" das auf meinen Button angezeigt wird

eine Taste zuzuordnen das ich von Input.inputString in einen String Schreibe.

Also z.b. ich hab W zugeordnet dann wird aus "Forward Walk =" = "Forward Walk = W"

Schönen Dank den Hilfegebenden.

Komponente.jpg

Share this post


Link to post
Share on other sites

Buttons sehen ja standardmäßig so aus:

  • Button (mit Button-Komponente)
    • Text (mit Text-Komponente)

Das ist, damit man da beliebig rumfummeln kann und z.B. Bildchen statt oder zusätzlich zum Text in den Button packen kann.

Wenn du also den Button hast, dann musst du dir die Textkomponente vom untergeordneten Objekt besorgen. Da wir hier davon ausgehen können, dass dem Button untergeordnet nicht noch mehr Textkomponenten rumfliegen, können wir einfach mit GetComponentInChildren arbeiten.

myButton.GetComponentInChildren<Text>().text = "hallo i bims 1 text";

 

Share this post


Link to post
Share on other sites

ah GameObject myButton; hat gefehlt.

Nun kann ich play drücken aber es wird der Fehler angezeigt:

NullReferenceException: Object reference not set to an instance of an object
Tastatur.OnButtonClick () (at Assets/Script/Tastatur.cs:43)

 

 

Share this post


Link to post
Share on other sites

Naja, du kannst halt nicht erwarten, dass Unity magisch weiß, von welchem GameObject du redest. Du musst entweder ein serialisiertes Feld machen (z.B. mit public, für's Erste) und da das Objekt, das du meinst reinziehen (da kannste dann natürlich auch direkt das Text-Objekt reinziehen und dir das GetComponentInChildren sparen)... oder, du machst was anderes... weil's bei deinen drölf Tasten vielleicht etwas nervig wäre. Sowas wie Code, der über alle deine Buttons iteriert und dem onClick-Event einen Listener reinschmeißt. Ich hab das Gefühl, dass das jetzt eventuell nicht alles an Infos ist, was du brauchst, aber es ist für mich gerade etwas schwer einzuschätzen, was du so im Repertoire hast.

Share this post


Link to post
Share on other sites

Ja ich weiß das Unity nicht weiß was ich will und ihr scheinbar auch nicht. Meine Frage kommt logisch vor, für mich zumindest.

Aber ich lerne noch, das verzeiht mir bitte.

Versuche nochmal zu erklären.

Hab ein ganz normalen Button deren Text der auf den Button angezeigt wird, ich per Script versuche zu ändern

mein Script sieht so aus:

 

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


public class Tastatur : MonoBehaviour
{
    public int i_While = 0;
    string taste = "";
    public GameObject myButton;

    public void OnButtonClick()
    {
        myButton.GetComponentInChildren<Text>().text = "hallo i bims 1 text";

        StartCoroutine(DoStuff());
    }

    private IEnumerator DoStuff()
    {
        i_While = 0;

        while (i_While < 1)
        {
            if (Input.inputString != "")
            {
                i_While = 1;

                taste = Input.inputString;

            }
            Debug.Log(i_While);
            Debug.Log(taste);

            yield return null; // Einen Frame warten
        }
    }
}

 

Habe alles unnötige gelöscht, waren hunderte Zeilen an versuchen :D

Meinen Button hab ich die Funktion OnButtonClick zugewiesen.

Deine Zeile myButton.GetComponentInChildren<Text>().text = "hallo i bims 1 text";

Erzeugt den Fehler: 

UnassignedReferenceException: The variable myButton of Tastatur has not been assigned.
You probably need to assign the myButton variable of the Tastatur script in the inspector.

Die Logik ist mir schon etwas Klar.

Klar ist mir aber das myButton nicht. Hab mein Button in myButton geändert, das Script zusätzlich den Button zugewiesen statt nur auf On Klick zu ziehen etc.

aber nix geht.

Mir ist nicht Klar wie ich auf Komponenten zugreife.

auf ein Cube das in der Scene rum schwirrt konnte ich mit

cube.GetComponent<Renderer>().material.color = Color.red;

Problemlos zugreifen. 

Das dies so kompliziert ist in Unity verstehe ich nicht.

In 3D Gamestudio war das sehr einfach. Script wird auf ein objekt gezogen und mit me und my konnte man was das Objekt zugreifen und auch ohne

vorher ein Gameobjekt etc. noch im Script anzugeben.

Hab extra ein Buch gekauft "Spiele Entwickeln mit Unity 5".

Das ist aber auch sehr mager. Da wird Scheibchenweiße Code gezeigt aber auch nicht gesagt, zu dieser Zeile braucht man noch 27 andere.

Das ist sowas von frustierend, vor allem wenn es nicht erklärt wird.

Ich bin sicher kein Mensch der nur abschreibt. ich will es auch verstehen wieso weshalb warum. Ich erarbeite gerne mein Zeugs selbst.

Aber wenn nach Tausend Ansätzen es noch immer nicht klappt, verzweifelt man halt.

Und jetzt beim zweiten lesen deines Textes @Sascha hab ichs verstanden.

Public Gameobjekt im Script und dem Script den Button rein ziehen bzw. den Text selbst und mit GetComponent.... darauf zugreifen.

Danke hab nach dem dritten Gong verstanden und mein Button Magischer Text ändert sich auf wundersame weiße. Danke es geht.:D

 

 

 

 

Share this post


Link to post
Share on other sites

Ergebnis

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


public class Tastatur : MonoBehaviour
{
    public int i_While = 0;                     //While Loop ein/aus
    string taste = "";                          //Taste die gedrückt wurde
    string myTextToButton = "Forward Walk = ";  //Text das auf Button erscheint
    public GameObject myTextFromButton;         //Text Objekt vom Button

    private void Start()
    {
        myTextFromButton.GetComponentInChildren<Text>().text = myTextToButton; //Text Beschriftung auf Button laden
    }



    public void OnButtonClick()
    {
        StartCoroutine(DoStuff());              //While Loop Starten
    }

    private IEnumerator DoStuff()
    {
        myTextToButton = "Forward Walk = ";     //Start Text für Button Beschriftung
        i_While = 0;

        while (i_While < 1)
        {
            if (Input.inputString != "")        //Läuft wenn eine Taste gedrückt wird
            {
                i_While = 1;                    //unterbricht While Loop

                taste = Input.inputString;      //gedrückte Taste wird in string geladen
                myTextToButton = myTextToButton + taste;    //Start Text wird mit Letzter gedrückter Taste erweitert
                myTextFromButton.GetComponentInChildren<Text>().text = myTextToButton;  //Text wird auf Button Beschriftung geladen
            }
            yield return null; // Einen Frame warten
        }
    }
}

Langsam wirds was mit mir :rolleyes:

Share this post


Link to post
Share on other sites

also wenn ich dich richtig verstehe willst du lediglich dass in deinem Button Textfeld z.b. sowas steht wie "Foward Walk = W" wenn die w taste gedrückt wird oder? wenn ja verstehe ich tbh nicht wofür der ganze code ist. evtl verstehe ich dein Anliegen auch falsch aber sollte das wirklich alles sein was du willst dann reicht diese code:

public class Tastatur : MonoBehaviour
{
    public Text myTextFromButton;


    public void LoadText()
    {
        myTextFromButton.text = "Forward Walk = " + Input.inputString;
    }
}

mehr solltest du eigentlich nicht brauchen. die "LoadText" Methode rufst du dann einfach über das button onClick event auf welches du hier findest:

Unbenannt.PNG.c2db77c4744a80b56f1be88aba28e714.PNG

du klickst auf das "+" und ziehst deine Tastatur komponente in dieses Feld:

Unbenannt1.PNG.054068c2c06a28b2d64611f9180c507e.PNG

Dann wählst du die auszuführende Funktion aus die gecalled werden soll wenn der button gedrückt wird. das ist in dem fall die LoadText() funktion:

Unbenannt2.PNG.4db715f5bb441f3a8fc6bbcb19c5ae3d.PNG

mehr solltest du nicht brauchen. bei mir funktioniert es. 

Share this post


Link to post
Share on other sites

Soweit ich das verstanden hatte, soll der Code jeden Frame schauen, ob eine Taste gedrückt wurde - nicht nur, wenn der Button gerade gleichzeitig gedrückt wird. Wie beim Input-Optionsmenü, wo "drücke eine Taste für 'Springen'" steht.

Share this post


Link to post
Share on other sites

Jepp, erst Button drücken und dann eine Taste zuweisen, so wie es in fast jeden Spiel so ist.

Mein Script wird länger und länger....

Stelle noch verschiedene Button Farben ein usw...

Dann wird die gewählte Taste noch in den Input Manager übergeben, hoffe bekomme es hin, wird schon.

Was aber noch schön wäre, wäre wenn ich den Button Namen auslesen kann, aber mit GetComponent<Text>().text etc. wirds nix, ist ja nicht in einer Text

Komponente. Das gleiche gilt auch in der Text Komponente Font Size.

Gibts irgendwo eine Liste wo man alle Zugriffe auf Komponenten nachschlagen kann oder so?

Ach und eine bestimmte anzahl von einen String löschen?

 Console.WriteLine(stringEndText.Remove(5, 10)); etc. will nicht. Wäre eh nicht ganz so was ich suche, da ich vom Ende paar Zeichen löschen will.

Fehlt vermutlich ein Using am scriptanfang.

Gibt sicherlich auch ne Liste dafür?

Achja jede menge Kram noch. Man lernt nie aus.

Mal schaun wie ich das so mache....

 

KomponenteOderNicht.jpg

KomponenteOderNicht2.jpg

Share this post


Link to post
Share on other sites
vor 39 Minuten schrieb Sir_Mathew:

Was aber noch schön wäre, wäre wenn ich den Button Namen auslesen kann

GameObject.name, aber glaub mir, das willst du so nach Möglichkeit nicht machen.

vor 40 Minuten schrieb Sir_Mathew:

Gibts irgendwo eine Liste wo man alle Zugriffe auf Komponenten nachschlagen kann oder so?

Zugriffe auf Komponenten? Also... dass du einsehen kannst, welcher Code welche Komponente angefasst hat? Nein, das geht nicht. Aber was auch immer du damit bezwecken willst, geht sicherlich auch anders ;)

vor 41 Minuten schrieb Sir_Mathew:

Ach und eine bestimmte anzahl von einen String löschen?

Also die letzten X Zeichen von einem String wegnehmen?

Substring ist dein Freund. Das gibt dir einen Teilstring zurück, z.B. die ersten X Zeichen oder die Zeichen von Index 3-11. Wenn du was abschneiden willst, packst du da die Länge des Strings rein minus die Anzahl an zu löschenden Zeichen, und dann kriegst du eben nur das wieder, was übrig bleibt.

var amountOfCharsToRemove = 5;
var s = "Hallo Welt";

s = s.Substring(0, s.Length - amountOfCharsToRemove);

Debug.Log(s); // "Hallo"

 

vor 44 Minuten schrieb Sir_Mathew:

Gibt sicherlich auch ne Liste dafür?

Gibt halt viel zu viel Zeugs, als dass man das alles vernünftig in eine Liste packeb könnte, aber man lernt irgendwann so die üblichen Anlaufpunkte. Bis dahin gerne einfach immer weiter Leute löchern ;)

Share this post


Link to post
Share on other sites
vor 2 Stunden schrieb Sascha:
vor 3 Stunden schrieb Sir_Mathew:

Was aber noch schön wäre, wäre wenn ich den Button Namen auslesen kann

GameObject.name, aber glaub mir, das willst du so nach Möglichkeit nicht machen.

Warum will ich das so nicht machen? Läuft doch super.

vor 2 Stunden schrieb Sascha:
vor 3 Stunden schrieb Sir_Mathew:

Ach und eine bestimmte anzahl von einen String löschen?

Also die letzten X Zeichen von einem String wegnehmen?

Substring ist dein Freund. Das gibt dir einen Teilstring zurück, z.B. die ersten X Zeichen oder die Zeichen von Index 3-11. Wenn du was abschneiden willst, packst du da die Länge des Strings rein minus die Anzahl an zu löschenden Zeichen, und dann kriegst du eben nur das wieder, was übrig bleibt.


var amountOfCharsToRemove = 5;
var s = "Hallo Welt";

s = s.Substring(0, s.Length - amountOfCharsToRemove);

Debug.Log(s); // "Hallo"

Läuft super, danke.

Share this post


Link to post
Share on other sites
vor 38 Minuten schrieb Sir_Mathew:

Warum will ich das so nicht machen? Läuft doch super.

Klar, ist nicht so, dass das nicht funktionieren würde. Das Problem ist, dass niemand dich daran hindert, mal den Namen eines GameObjects zu ändern. Und in einem Monat hast du vergessen, dass GameObject X aber einen spezifischen Namen braucht, damit Script Y richtig funktioniert. Und plötzlich hast du nen dicken Bug und bei sowas ist der idR gleich von der Sorte "superschwer zu finden und zu beheben". Wenn du mal nicht alleine arbeitest, sondern in einem Team, ist die Wahrscheinlichkeit, dass da was schief geht, gleich nochmal viel größer.

Strings sind Kacke. Die sollte man nach Möglichkeit nur für Input und Output benutzen, nicht für interne Abläufe des Programms. Dir geht halt der Compiler komplett verloren, der dir sonst immer Warnungen und Fehlermeldungen geben kann.

Und das beste: Es gibt immer eine bessere Möglichkeit ;)

  • Haha 1

Share this post


Link to post
Share on other sites
vor einer Stunde schrieb Sascha:
vor 2 Stunden schrieb Sir_Mathew:

Warum will ich das so nicht machen? Läuft doch super.

Klar, ist nicht so, dass das nicht funktionieren würde. Das Problem ist, dass niemand dich daran hindert, mal den Namen eines GameObjects zu ändern. Und in einem Monat hast du vergessen, dass GameObject X aber einen spezifischen Namen braucht, damit Script Y richtig funktioniert. Und plötzlich hast du nen dicken Bug und bei sowas ist der idR gleich von der Sorte "superschwer zu finden und zu beheben". Wenn du mal nicht alleine arbeitest, sondern in einem Team, ist die Wahrscheinlichkeit, dass da was schief geht, gleich nochmal viel größer.

Strings sind Kacke. Die sollte man nach Möglichkeit nur für Input und Output benutzen, nicht für interne Abläufe des Programms. Dir geht halt der Compiler komplett verloren, der dir sonst immer Warnungen und Fehlermeldungen geben kann.

Und das beste: Es gibt immer eine bessere Möglichkeit ;)

An GameObject Names änderung hab ich garnicht gedacht und wäre ja unsinnig. Benutze das für meine Buttons die ich beschrifte, ins Script Lade, mein gedöhns dazu und als Text auf den Button Projeziert wie im Bild..

Würde ein Fehler dann auch sofort sehen. Nutze somit ein String als Input:D

Da fällt mir sogar gerade auf, kann man eine Komponente eigentlich erweitern?

Eine Grundeinstellung für Tasten gebe ich mit String vor das ich aber im Script Komponente eingebe, wäre super diese in Button Komponente gleich mit drin zu haben.

Diese müsste aber gleich zur Entwicklungszeit eingefügt werden. (das wäre nur so ein kleines schmankel).

Und das Strings Kacke sind.. hm steig da nicht hinter. Find tag etc...  hmmmm  schnall ich noch nicht. Ist wohl Profi Zone, da komme ich später hin. 

 

Laufen.jpg

TasteZuKomponente.jpg

Share this post


Link to post
Share on other sites
vor 25 Minuten schrieb Sir_Mathew:

Und das Strings Kacke sind.. hm steig da nicht hinter

Ganz stark zusammengefasst:

GetComponent("LIght")
GetComponent<LIght>()

Habe mich hier vertippt (das I muss natürlich klein). Beim oberen kracht es zur Laufzeit, während lauter verschiedene Sachen passieren. Das zweite wird direkt vom Compiler erkannt, der dir einen Fehler entgegenschmeißt, in dem steht, was los ist und in welcher Zeile.

vor 28 Minuten schrieb Sir_Mathew:

Da fällt mir sogar gerade auf, kann man eine Komponente eigentlich erweitern?

Du meinst Unity-Komponenten? Extension Methods können manchmal helfen, aber in vielen Fällen läuft's eher auf eine neue Komponente hinaus, die mit der vorhandenen arbeitet.

Share this post


Link to post
Share on other sites
vor 28 Minuten schrieb Sascha:
GetComponent("LIght")
GetComponent<LIght>()

Habe mich hier vertippt (das I muss natürlich klein). Beim oberen kracht es zur Laufzeit, während lauter verschiedene Sachen passieren. Das zweite wird direkt vom Compiler erkannt, der dir einen Fehler entgegenschmeißt, in dem steht, was los ist und in welcher Zeile.

ahso in <> mach ich doch. Nur auf den Button Name komm ich damit leider nicht.

vor 29 Minuten schrieb Sascha:

Du meinst Unity-Komponenten? Extension Methods können manchmal helfen, aber in vielen Fällen läuft's eher auf eine neue Komponente hinaus, die mit der vorhandenen arbeitet

Hm also kann man mit Extension Methode da was machen, was auch immer das ist bzw. man es macht. Vermutlich sehr kompliziert.

Share this post


Link to post
Share on other sites
vor 21 Stunden schrieb Sir_Mathew:

ahso in <> mach ich doch. Nur auf den Button Name komm ich damit leider nicht.

Ist halt ein Beispiel, warum Strings doof sind. Gewählt für die Anschaulichkeit durch den direkten Vergleich. Dieselbe Argumentation lässt sich aber auf alles übertragen.

vor 21 Stunden schrieb Sir_Mathew:

Hm also kann man mit Extension Methode da was machen, was auch immer das ist bzw. man es macht. Vermutlich sehr kompliziert.

Ja. Ist zwar in den meisten Fällen nur Syntax-Zucker, aber das kann ja auch von Vorteil sein. Ist auch gar nicht mal so kompliziert.

So als Beispiel:

public static class ButtonExtensions
{
  public static void TryChangeText(this Button button, string newText)
  {
    var text = button.GetComponentInChildren<Text>();
    if (text)
    {
      text.text = newText;
    }
  }
}

Dann kannst du

myButton.TryChangeText("Hello World");

machen.

Share this post


Link to post
Share on other sites
vor 9 Stunden schrieb Sascha:
vor 20 Stunden schrieb Sir_Mathew:

Hm also kann man mit Extension Methode da was machen, was auch immer das ist bzw. man es macht. Vermutlich sehr kompliziert.

Ja. Ist zwar in den meisten Fällen nur Syntax-Zucker, aber das kann ja auch von Vorteil sein. Ist auch gar nicht mal so kompliziert.

So als Beispiel:


public static class ButtonExtentions
{
  public static void TryChangeText(this Button button, string newText)
  {
    var text = button.GetComponentInChildren<Text>();
    if (text)
    {
      text.text = newText;
    }
  }
}

Dann kannst du


myButton.TryChangeText("Hello World");

machen.

Lol hab Stunden Lang rumprobiert und gelesen etc... nix hat geklappt.

Nun Nochmal probiert und der Code wird nicht mehr Fehlerhaft angezeigt.

Aber es passiert auch nix.

Ist mir doch zu Hoch.

Hab das Script in meines eingebunden und auch in eigenen Script im Editor Ordner gepackt...

Standard Button als auch umgeschriebene Buttons zugewiesen etc.

Was soll denn passieren?

 

Share this post


Link to post
Share on other sites

Ist ja nichts wichtiges, ist wie gesagt nur Syntax-Zucker, also dafür, dass der Aufruf hübscher aussieht.

Weiß aber nicht, was da schiefgeht. Einfach den Inhalt des ersten Codes in eine Date, "using UnityEngine.UI;" drüber und irgendwo hin speichern, nur bittet nicht in einen Editor-Ordner. Und dann an beliebiger Stelle TryChangeText an einem beliebigen Button aufrufen. Und dann ist halt der Text geändert. Nichts allzu besonderes.

Share this post


Link to post
Share on other sites

Achso jetzt weiß ich was du damit meinst.

Ich nehme da doch lieber Objekt.name

Selbst wenn ich den Namen meines Objektes ändern würde, hat es keinen einfluss auf den Code, da ich den Namen für das Beschriften des Buttons nutze.

Sollte ich den Namen ändern, dann sehe ich es am Button :D

----

Ich dachte der Code ist zum ändern von Komponenten wie ich eigentlich fragte.

Habs im Bild nochmal Markiert. Wollte den String Taste in den Button unterm Namen einfügen, das geht vermutlich dann nur doch ändern des Editors 

zur Entwicklungszeit.

Wenn´s geht, wäre das super, ansonsten mach ich das so weiter wie ich es derzeit habe.

 

TastezuKomponente2.jpg

Share this post


Link to post
Share on other sites
vor 9 Stunden schrieb Sir_Mathew:

Selbst wenn ich den Namen meines Objektes ändern würde, hat es keinen einfluss auf den Code, da ich den Namen für das Beschriften des Buttons nutze.

Achso... Ja, das geht tatsächlich. Ist ja direkt Output dann. Da sag ich nicht mal was gegen :D

vor 9 Stunden schrieb Sir_Mathew:

Ich dachte der Code ist zum ändern von Komponenten wie ich eigentlich fragte.

Naja, die Frage war

Am 3.1.2021 um 21:17 schrieb Sir_Mathew:

Da fällt mir sogar gerade auf, kann man eine Komponente eigentlich erweitern?

und das ist der Weg, mit dem du sie erweitern kannst. Bestehende Aspekte ändern geht nicht. Aber damit meine ich strukturelle Sachen. Du kannst z.B. nicht einer Lichtkomponente eine zweite Farbeigenschaft geben und dann mit der irgendetwas machen (z.B. hin und her wechseln). Dafür muss dann eine zusätzliche Komponente her. Die Werte der Eigenschaften einer Komponente kannst du sehr wohl ändern.

vor 9 Stunden schrieb Sir_Mathew:

Wollte den String Taste in den Button unterm Namen einfügen

Verstehe ich ehrlich gesagt nicht.

vor 9 Stunden schrieb Sir_Mathew:

das geht vermutlich dann nur doch ändern des Editors 

zur Entwicklungszeit.

Was auch immer du damit meinst... vermutlich nicht :)

Du kannst wie gesagt alles mögliche zur Laufzeit ändern. Einfach mal die Scripting Reference aufmachen und da nach der Komponente suchen, an der du etwas machen willst.

Share this post


Link to post
Share on other sites

Ok lassen wirs, hab aufgegeben.

Hab heut erstes mal Array genutzt, auch wenn ich es schon seid Jahren kenne. Habs auch gleich wieder verworfen, habs nun gaaaanz anders gelöst.

Jeder Button bekommt jetzt das gleiche Script. Und Jeder Button bekommt eine ID.

Nun kann ich jeden Button eindeutig identifizieren.

 private IEnumerator IEnumWhile()
    {
        intWhile = 0;
        stringEndText = stringLücke + stringLücke + stringLücke + stringButtonBeschriftung + stringLücke + stringGleichheitszeichen + stringLücke + stringSternchen + stringSternchen + stringSternchen;
        buttonButton.GetComponentInChildren<Text>().text = stringEndText;

        while (intWhile < 1)
        {
            if (Input.inputString != "")        //Läuft wenn eine Taste gedrückt wird
            {
                intWhile = 1;
                stringEndText = stringLücke + stringLücke + stringLücke + stringButtonBeschriftung + stringLücke + stringGleichheitszeichen + stringLücke + Input.inputString;
                buttonButton.GetComponentInChildren<Text>().text = stringEndText;

                ButtonFarbeGrundeinstellung();
                TasteZuweisen();

                translation = Input.GetAxis("Vertical"); /////////////////////////////////////////////////////////////////hmmmmmmmmmmmm

            }
            yield return null; // Einen Frame warten
        }
    }

    private void TasteZuweisen()
    {
        switch (intButtonID)
        {

            case 1:
                //Input.GetAxis("Vertical") = Input.inputString; /////////////////////////////////////////////////////////////////hmmmmmmmmmmmm

                break;
            case 2:
                Debug.Log(translation);

                break;

        }


    }
 

 Und in eine switch werte ich die Button ID aus.

Bis hier hin alles gut.

Hab also nun die Benutzerdefinierte Taste z.b. K und diese will ich in den Input.GetAxis("Vertical") laden, diese in externer Datei Speichern, damit bei neustart 

die Zuordnung der Tasten wieder geladen werden.

ScriptID.jpg

Share this post


Link to post
Share on other sites

So hab vieles gelernt bis hier her. Nun hab ich ein kleines Problem, mir fehlt hier ein Ansatz

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

public class Tastatur : MonoBehaviour
{
    public Button buttonButton;
    public string stringTaste = "";
    public int intButtonID = 0;

    private string stringButtonBeschriftung = "";
    private string stringGleichheitszeichen = "=";
    private string stringSternchen = "*";
    private string stringLücke = " ";
    private string stringEndText = "";
    private Color colorButton;
    private ColorBlock cb;
    private int intWhile = 0;

    static int scriptZähler = 0;

    // Start is called before the first frame update
    void Start()
    {
        stringTaste = PlayerPrefs.GetString("stringTaste");

        buttonButton.GetComponentInChildren<Text>().fontSize = 12;
        buttonButton.GetComponentInChildren<Text>().alignment = TextAnchor.MiddleLeft;
        stringButtonBeschriftung = buttonButton.name;
        stringEndText = stringLücke + stringLücke + stringLücke + stringButtonBeschriftung + stringLücke + stringGleichheitszeichen + stringLücke + stringTaste;
        buttonButton.GetComponentInChildren<Text>().text = stringEndText;
        scriptZähler++;

        ButtonFarbeGrundeinstellung();

        Debug.Log(scriptZähler); //test
        Debug.Log(stringTaste); //test
    }

    private void Update()
    {
        if ((stringTaste == Input.inputString) && (intButtonID == 1))
        {
            Debug.Log("getroffen1");
        }
        if ((stringTaste == Input.inputString) && (intButtonID == 2))
        {
            Debug.Log("getroffen2");
        }
    }

    void ButtonFarbeGrundeinstellung()
    {
        colorButton = new Vector4(0.0f, 1.0f, 0.0f, 1.0f); //Button Farbe Normal Color
        cb = buttonButton.colors;
        cb.normalColor = colorButton;
        buttonButton.colors = cb;

        colorButton = new Vector4(0.3f, 1.0f, 0.7f, 1.0f); //Button Farbe Highlighted Color
        cb = buttonButton.colors;
        cb.highlightedColor = colorButton;
        buttonButton.colors = cb;

        colorButton = new Vector4(0.8f, 1.0f, 0.7f, 1.0f); //Button Farbe Pressed Color
        cb = buttonButton.colors;
        cb.pressedColor = colorButton;
        buttonButton.colors = cb;

        colorButton = new Vector4(1.0f, 0.0f, 0.0f, 1.0f); //Button Farbe Selected Color
        cb = buttonButton.colors;
        cb.selectedColor = colorButton;
        buttonButton.colors = cb;
    }

    void ButtonFarbeKlick()
    {
        colorButton = new Vector4(1.0f, 0.0f, 0.0f, 1.0f); //Button Farbe Normal Color
        cb = buttonButton.colors;
        cb.normalColor = colorButton;
        buttonButton.colors = cb;

        colorButton = new Vector4(1.0f, 0.0f, 0.0f, 1.0f); //Button Farbe Highlighted Color
        cb = buttonButton.colors;
        cb.highlightedColor = colorButton;
        buttonButton.colors = cb;

        colorButton = new Vector4(1.0f, 0.0f, 0.0f, 1.0f); //Button Farbe Pressed Color
        cb = buttonButton.colors;
        cb.pressedColor = colorButton;
        buttonButton.colors = cb;

        colorButton = new Vector4(1.0f, 0.0f, 0.0f, 1.0f); //Button Farbe Selected Color
        cb = buttonButton.colors;
        cb.selectedColor = colorButton;
        buttonButton.colors = cb;
    }

    public void ButtonKlick()
    {
        ButtonFarbeKlick();
        StartCoroutine(IEnumWhile());
    }

    private IEnumerator IEnumWhile()
    {
        intWhile = 0;
        stringEndText = stringLücke + stringLücke + stringLücke + stringButtonBeschriftung + stringLücke + stringGleichheitszeichen + stringLücke + stringSternchen + stringSternchen + stringSternchen;
        buttonButton.GetComponentInChildren<Text>().text = stringEndText;

        while (intWhile < 1)
        {
            if (Input.inputString != "")        //Läuft wenn eine Taste gedrückt wird
            {
                intWhile = 1;
                stringEndText = stringLücke + stringLücke + stringLücke + stringButtonBeschriftung + stringLücke + stringGleichheitszeichen + stringLücke + Input.inputString;
                buttonButton.GetComponentInChildren<Text>().text = stringEndText;
                stringTaste = Input.inputString;

                ButtonFarbeGrundeinstellung();

                PlayerPrefs.SetString("stringTaste", stringTaste);
            }
            yield return null; // Einen Frame warten
        }
    }
}

Hab nun die Individuelle Tastenzuordnung eigentlich soweit Fertig.

Jeder Button nutzt das gleiche Script mit verschiedenen Instanzen.

Mit static int scriptZähler zähle ich nun die Instanzen

Soweit so gut.

Mit

PlayerPrefs.SetString("stringTaste", stringTaste);

speicher ich die gewählte Taste und mit

stringTaste = PlayerPrefs.GetString("stringTaste");

Lade ich die Taste wieder.

Aber da werden nicht die bisher 2 Instanzen berücksichtigt.

Man könnte jetzt Array´s erstellen z.b.

stringTaste[intButtonID]

aber dann hätte ich viele leere Array´s

z.b. zweite Instanz würde dann auf stringTaste[1] zugreifen aber stringTaste[0] würde leer bleiben.

Bei 10 Instanzen wären dann 9 leer usw.

Ich hoffe ihr versteht was ich meine und könnt mir da weiter helfen.

 

 

testButton.jpg

Share this post


Link to post
Share on other sites

So hab nun noch einiges rumprobiert.

Wollte nun alles mit PlayerPrefs speichern und laden.

Und das funktioniert leider nicht wie erhofft.

 private static string[] stringTastePlayer = new string[15];

 void Start()
{
        stringTaste = PlayerPrefs.GetString(stringTastePlayer[intButtonID]);
}


    private IEnumerator IEnumWhile()
{
code.......
		stringTastePlayer[intButtonID] = stringTaste;
        PlayerPrefs.SetString(stringTastePlayer[intButtonID], stringTastePlayer[intButtonID]);
}

Also erstelle ein Array. in diese lade ich dann meine Taste, funktioniert bis dahin alles.

Aber das Speichern und laden von Array´s funktioniert so nicht?

Eigentlich würde man ja

stringTaste = PlayerPrefs.GetString("taste");

und

 PlayerPrefs.SetString("taste", stringTastePlayer[intButtonID]);

schreiben. Ich wollte das aber dynamischer speichern und nicht für jeden einzelnen Wert einen Text zufügen.

Ist das irgendwie möglich?

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...