Jump to content
Unity Insider Forum
Sign in to follow this  
nordseekrabe

Zugriff auf Value einer Dictionary

Recommended Posts

public  Dictionary<string, string> TheTargets = new Dictionary<string, string>();  ist ein Dictionary mit Städtenamen als Key und als Value Informationen zur Stadt. Wie greift man auf den string von Value zu, um ihn in einem UiText anzubinden ??

public static void LoadTheStadtInfo()
    {
        sceneName = SceneManager.GetActiveScene().name;  // es wird der Szenenname der aktuellen Szene  geprüft
        if (TheTargets.ContainsKey("sceneName"))                      // wenn dieser Stadtname in der Dictionary vorhanden ist
        {
           stadtText.text = TheTargets [Value];                                 soll der Value-Text dieser Stadt in der stadtText.text gespeichert werden; stadtText ist das TextUI in einem Canvas
         }
    }

Leider funktioniert obige Funktion nicht. Für Hinweise oder Tipps bin sehr dankbar.

Nordseekrabbe

Share this post


Link to post
Share on other sites

Warum fragst du "sceneName" ab, steckst dann aber als Key "Value" da rein?

Warum ist "sceneName" ein String-Literal? Da stimmen einfach ganz viele Basics nicht.

Share this post


Link to post
Share on other sites

Danke für Eure Reaktion. Grundaufbau: 50 Szenen mit einem Stadtbild einer Stadt (Name der Stadt ist der KeyString des Dictionary). Auf Buttonclick soll eine Beschreibung der Stadt gezeigt werden ( 2. String entsprechend Value des Dictionary). Die ca. 50 Städte als Collection (Array, List, Dictionary) zu erfassen, schien mir sinnvoll. Da zu jeder Stadt ein Text (Informationen) gehört, der bei Buttonclick auf dem Display gezeigt werden soll, dabei müssen StadtName und StadtInfo natürlich zusammenpassen, fand ich die Idee, mit einem Dictionary zu arbeiten, naheliegend. Leider ergibt sich nun für mich das Problem,  wie auf den Text zugreifen und auf ein Canvas-Panel-UIText binden.

Nordseekrabbe 

 

Share this post


Link to post
Share on other sites

Okay, offenbar müssen wir da nochmal durch...

  1. Zuerst einmal...

    sceneName
    ist nicht dasselbe wie
    "sceneName"

    Das erste ist ein Variablenname, das zweite ein Literal. Beispiel:
     

    var wort = "Hund";
    Debug.Log(wort); // Gibt "Hund" aus.
    Debug.Log("wort"); // Gibt "wort" aus.

    Wenn du also

    TheTargets.ContainsKey("sceneName")

    schreibst, dann suchst du nach "sceneName" und nicht nach dem String-Wert von der Variable sceneName, der in der Zeile davor gesetzt wird.

  2. Was ist

    Value

    ? Wo definierst du das? Du musst ja in die eckigen Klammern entweder ein Literal oder einen Variablennamen reinpacken. (Oder sonst irgendeinen Ausdruck, der zu einem Wert evaluiert, so wie du 2+2 statt 4 schreiben kannst).
    In diesem Fall willst du ja offenbar den Namen der Szene als Schlüssel benutzen und den passenden Wert finden. Also musst du auch

    TheTargets[sceneName]

    schreiben.

Share this post


Link to post
Share on other sites

Danke, Sascha, verstanden.  Die Funktion sieht inzischen so aus:

public void LoadStadtInfo() {

sceneName = SceneManager.GetActiveScene().name;

Debug.Log("SceneName ist " + sceneName);   // es wird der korrekte Stadtname der aktuellen Szene benannt, hier Bamberg

if (TheTargets.ContainsKey(sceneName))

{ stadtText = TheTargets[sceneName]; } }

wobei     "public Dictionary<string, string> TheTargets = new Dictionary<string, string>(); " und "string sceneName;"    "public string stadtText;" deklariert sind (stadtText ist  UIText)

als Beispiel ein Element der Dictionary

TheTargets.Add("Bamberg", "In mehr als 1000 Jahren ist ein einzigartiges historisches Stadtbild gewachsen.....");

Leider erscheint der Fehler: "The given key was not present in the dictionary"

Wo hat sich da ein Fehler eingeschlichen ?

Nordseekrabbe

Share this post


Link to post
Share on other sites

Benutze mal bitte den <>-Knopf über dem Textfeld, und packe da deinen Code rein, dann kann man den sogar lesen ;)

Erstmal:

vor 2 Stunden schrieb nordseekrabe:

"public string stadtText;" deklariert sind (stadtText ist  UIText)

Also, entweder die Variable ist vom Typ string, oder sie ist vom Typ UIText. Beides geht nicht.

vor 2 Stunden schrieb nordseekrabe:

Leider erscheint der Fehler: "The given key was not present in the dictionary"

Bei diesem Code:

if (TheTargets.ContainsKey(sceneName))
{
  stadtText = TheTargets[sceneName];
}

kann dieser Fehler unmöglich™ auftreten. Leere einmal deine Konsole (nicht, dass das ein alter Fehler ist, der einfach immer noch in der Liste steht, obwohl er nicht mehr aktuell ist) und schaue danach, in welcher Zeile er wirklich auftritt.

Share this post


Link to post
Share on other sites

Okay, Fehler ist weg, nachdem ich  { } nach der if-Abfrage  hinzugefügt habe. Hatte ich nach Hinzufügen von Debug.Log vergessen, so schnell entstehen (banale) Fehler mit schweren Folgen. 

public static void LoadTheStadtInfo(string _stadtText)
    {
        sceneName = SceneManager.GetActiveScene().name;
        Debug.Log("sceneName ist " + sceneName);
        if (TheTargets.ContainsKey(sceneName))
        {
            Debug.Log("sceneName ist" + sceneName);
            stadtText = TheTargets[sceneName];
        }
    }

In der Klasse "Stadt" ist stadtText ein string, in der Klasse  "InputFieldScript" ist stadtText eine public Text Variable.  Deshalb erscheint wohl bislang im UI-Text kein Text. In der Funktion "ShowInfo()" fehlt ja wohl noch die Verbindung.

public void ShowInfo()  
    {
        InfoText.enabled = true;
        SceneActivate();
        Stadt.LoadTheStadtInfo(Stadt.stadtText);
        
        stadtText.text = Stadt.stadtText;

Obwohl keine Fehlermeldung auftaucht, bleibt der erhoffte Text aber aus.

Nordseekrabbe

Share this post


Link to post
Share on other sites

Du übergibst einen string "_stadtText" (warum auch immer der Parametername mit Unterstrich anfängt...) und machst damit nichts. Ich bin mir recht sicher, dass das so nicht richtig ist ;)

Share this post


Link to post
Share on other sites

Stimmt, daher auch kein Text. Habe die Funktion "LoadTheStadtInfo() gestrichen.  Die Klasse "Stadt" enthält nur noch die Elemente des Dictionary.  Die Funktion "ShowInfo()" sieht so aus:

public void ShowInfo() 
    {
        InfoText.enabled = true;
        SceneActivate();
        
        sceneName = SceneManager.GetActiveScene().name;
        stadtText.text = Stadt.TheTargets[sceneName];
     }

Das Stadt-Script wurde einem Empty GameObject zugewiesen und voila,  it works !!!.......Bis zu den nächsten Hürden.

Besten Dank, Sascha und ein schönes Wochenende 

Nordseekrabbe

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...
Sign in to follow this  

×
×
  • Create New...