Jump to content
Unity Insider Forum

[gelöst]Wie können die Childs eines deaktivierten UI-Elements aktualisiert werden?


Malthea
 Share

Recommended Posts

Hallo,

 

ich suche nach einer Möglichkeit, die childs eines UI-Elements, das mit SetActive(false) deaktiviert wurde, zu aktualisieren. Für die Initialisierung beim Spielstart löse ich das, indem ich das UI-Element für die Initialisierung aktiviere.


Bei erforderlichen Aktualisierungen im laufenden Spiel möchte ich nicht, dass das UI-Elemnt sichtbar wird. Ich könnte das über eine Verschiebung des UI-Elements aus dem gerenderten Bereich lösen, hoffe aber, das es eine bessere Möglichkeit gibt.

Grüße Malthea

 

Link to comment
Share on other sites

Hi!

Die Frage ist, was du mit aktualisieren meinst.
Willst du ne Grafik oder einen Textaustauschen?
Das sollte auch im nicht akitven Element funktionieren, wenn du ds von Außen, also einem anderen Script machst und eine Referenz zu diesem UI Element besteht.

Also:

Ein Script hat eine Referenz zu einer Text Komponente. Also eine Text Variable (nennen wir sie mal myText). Diese Variable muss gefüllt sein damit es geht. Ist die Variable public, kannst du einfach die Text Komponente im Inspector auf die entsprechende Variable fallen lassen. Jetzt kennt dein Script das Element, egal, ob das Objekt aktiv ist oder nicht.
Es könnte auch sein, dass du nur das Gameobjekt kennst, welches du ja per SetActive schaltest. Dann suchst du halt in diesem Gameobjekt nach der Textkomponente und weist sie einer Variable zu.

myText= DasObjekt.GetComponent<Text>();

Nun könntest du im Script ganz einfach zu irgendeinem Zeitpunkt sowas tun:

myText.text= "Test";

Die Textkomponente hat jetzt in seinem Textfeld diesen Text bekommen.

Mit Grafiken geht das genauso.

Alles was du kennst kannst du verändern. Du musst es nur vorher kennen. Ist ein Objekt deaktiviert, findest du es nicht zur Laufzeit und kannst keine Referenz dazu bilden. Ist die Referenz aber schon da, dann kommst du auch da ran.
 

Link to comment
Share on other sites

Hallo,

Danke für die Rückmeldung. Hier eine genauere Beschreibung: Es handelt sich um ein Questlog, das auf 2 panels (aktuelle und gelöste Quests) abgebildet wird.
Die Hierachie: ein Empty mit dem QuestlogDisplay-"Verwaltungsskript", child 1 ist ein canvas, das voreingestellt inaktiv ist. Child 2 ist ein weiteres Empty, das wiederum die beiden panels (von denen das gelöste-Quests-Panel voreingestellt inaktiv ist) und das tabulatorpanel als childs hat.

Beim Spielstart werden die gespeicherten offenen und die erledigten Quests vom Questmanager an das QuestLogDisplaySkript übergeben und von diesem wird für jede Quest ein Logdisplay von einem Prefab für die Textanzeige in dem betreffenden Panel als child generiert und die einzelnen Textelemente gefüllt.

Im Spielverlauf können natürlich neue Quests dazukommen bzw erledigte müssen auf den offene-Quests-panel gelöscht werden.

Zu deiner Eingangsfrage: aktualisieren bedeutet einerseits neue Logdisplays zu generieren, ggf erledigte Questlogdisplays im offene-Quests-display löschen bzw bei erledigten Teilquests den betreffenden Text zu aktualisieren.

Ich habe in der Zwischenzeit weiter herumprobiert und festgestellt, das eine kurze Aktivierung des Questcanvas ingame nicht sichtbar ist. Da für eine Aktualisierung der beiden panels diese ggf auch aktiviert werden müssen, musste ich allerdings in das QuestLogDisplaySkript eine bool mit den zugehörigen Abfragen einbauen, um die letzte Panelauswahl des Spieles zu sichern, was natürlich extra Aufwand und somit unschön ist.

Eine Aktualisierung der Panels mit deaktiviertem canvas hat zwar keine Fehler, aber leere panels ergeben.

Grüße Malthea

Link to comment
Share on other sites

So ganz kann ich dir nicht folgen, aber es scheint so zu sein, dass es das Generieren ist, welche die Probleme bereitet, weil du das wohl von dem Verwaltungsscript aus anstuppst.

Wie wäre es, wenn diese Teilbereiche sich selber organisieren sobald sie aktiv werden? Das ginge sehr gut mit OnEnable(), weil das immer aufgerufen wird, sobald das Script enalbled wird. Und es wird immer dann enabled, wenn das Gameobject aktiviert wird.

Es ist immer eine Frage des Designs. Entweder hat man ein Objekt (Verwalter), welches andere Objekte (Sklaven) kennt und ihnen sagt, was zu tun ist oder sie sogar aktiv verändert.
Oder man hat ein Objekt (Anzeiger) welches nur Infos bereitstellt und die anderen Objekte (Autonome) organisieren sich aufgrund der Informationen komplett selbst.

Beide Wege haben Vor- und Nachteile.

Link to comment
Share on other sites

Ich habe zwei Screens gemacht - der erste zeigt das Resultat bei der Initialisierung mit deaktiviertem Questcanvas.
Für beide Quests wurde ein Prefab instanziert und korrekt mit den jeweiligen Texten gefüllt.


Quest_1.thumb.jpg.9e1c86b8c0744f4328e9786d79e30184.jpg

Der zweite zeigt das Questpanel nach einer Initialisierung bei aktiviertem Questcanvas - so wie es sein soll.

Quest_2.thumb.jpg.910096eadbe8e7753fcc0bc2bb5ca4e2.jpg

Merkwürdig ist die unterschiedliche Positionierung der Questanzeigeprefabs im Editorfenster - bei gleichen RectTransform-Werten.

Generiert werden die Anzeigeprefabs in beiden Fällen - es scheint also nicht an der Generierung zu liegen. Der einzige Unterschied zwischen beiden Screens ist, das einmal das Questpanel inaktiv und einmal aktiv ist ...

[edit] ich habe gerade gesehen, das im ersten Screen der QuestTitelText nicht mehr im Editorfenster ausgewählt ist - die unterschiedliche Position also andere Gründe haben kann

Link to comment
Share on other sites

Komisch.
Dieser Quest Display Clone ist dein Prefab?
Hast du mal geschaut, ob der Skalierungsfaktor des Clones noch bei 1,1,1 steht?
Das ist nur so ins blaue gedacht, aber ich habe die Erfahrung gemacht, dass gerade der Skalierungsfaktor gerne mal auf 0,0,0 geht, wenn man UI Elemente von einem Überobjekt nimmt und in ein anderes Überobjekt schiebt. Das kan alles mit dem dynamischen Skalieren des Canvas zu tun haben, welches ja zur Laufzeit geschieht.
Da zu sein scheint jedenfalls alles. Das Textobjekt ist da und mit richtigen Werten gefüllt. Die Frage ist nur, warum man es nicht sieht. Ist es an anderer Stelle oder ist eben der Vatter auf 0 skaliert.

Link to comment
Share on other sites

  • Malthea changed the title to [gelöst]Wie können die Childs eines deaktivierten UI-Elements aktualisiert werden?

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...
 Share

×
×
  • Create New...