Jump to content
Unity Insider Forum

Instantiate von Buttons


Strooja0108

Recommended Posts

Hallo Leute,

nach langer Zeit muss ich euch mal wieder mit einer Frage belästigen.  Ich erzeuge mit Instantiate,  Textobjekte,dessen Text zum Beispiel  "Du hast 100 Euro gewonnen"  lautet.Ich möchte jetzt hinter dem Text einen Button haben,der wenn ich auf ihn klicke das Geld aus dem Text meinem Konto hinzufügt.

Am ehesten ist das was ich machen möchte glaube ich mit dem Spiel Moorhuhn zu vergleichen.Wo jedes Huhn ein Wert hat und wenn man es anklickt bekommt man unterschiedliche Punkte.

Ich würde das sehr gerne mit Instantiate lösen,hat da jemand eine Idee wie das funktionieren kann? Die unterschiedlichen Werte für jeden Button( onKlick event )ist das was mich wahnsinnig macht.Ich weiss nicht wie das funktionieren soll.Oder vielleicht denke ich auch einfach falsch.

Ich bin für jede Hilfe dankbar.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst entweder selber Reaktionen in UnityEvents (wie onClick) einfügen oder eine Methode auf einem Script innerhalb des Prefabs verlinken.

Selber hinzufügen:

var button = Instantiate(buttonPrefab);
button.onClick.AddListener(() =>
{
  TuZeug(100);
});

Und beim fest Verlinken, was meistens die bessere Variante ist, baust du halt ein Script mit einer Methode, das landet irgendwo auf dem Prefab, der Button löst die MEthode auf und was dann in der Methode passiert, kannst du dann da implementieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da gibt es zwei Wege. Zum einen kannst du im Script, welches ja an dein Prefab gebunden ist, Werte angeben. Hier wäre z.B. ein Script zum Laden einer anderen Szene:

public string sceneName;

public void LoadScene()
{
  SceneManager.LoadScene(sceneName);
}

Jetzt kann man die Komponente in die Nähe des Buttons (oder halt direkt drauf) ziehen und den Namen der zu ladenden Szene eingeben.

Das funktioniert, weil du ja nicht die Methode der Klasse aufrufst, sondern der Instanz. Wenn du zwei Buttons hast, der eine zeigt auf das eine GameObject mit diesem Script drauf und der zweite zeigt auf ein anderes GO mit diesem Script, dann wird auch wirklich nur von der Komponenten-Instanz die Methode aufgerufen, auf die da gezeigt wird. Die beiden Komponenten-Instanzen können daher unterschiedliche Werte haben (z.B. für sceneName), und diese Werte werden dann bei der Ausführung berücksichtigt.

Alternativ kann man der Methode einen Parameter geben:

public void LoadScene(string sceneName)

und dann den Wert dieses Parameters beim Button einstellen.

Die erste Variante ist vielseitiger, da der Button nur einen Parameter übergeben kann, man aber beliebig viele Felder in das Script packen kann. Die erste Variante erlaubt dir, dass du eine Methode in einem Script ausführen kannst, das eben nicht schon vorher weiß, welchen Wert es haben muss. Man denke z.B. an eine Light-Komponente. Die hat ja auch kein Feld "Farbe, die ich annehme, wenn ein Button gedrückt wird". Für solche Fälle kann man dann sagen Light.color und eine Farbe direkt im Inspektor des Buttons einstellen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke wiedereinmal für deine schnelle Antwort. Ich denke ich muss mir das noch ein paar mal durchlesen ,denn bis jetzt verstehe ich nur Bahnhof. Ich habe zurzeit eine Scene wo durch Instantiate alle paar Sekunden ein weiterer Text, mit einem Button dahinter, an einem zufälligen Ort aufm Bildschirm erscheint.Klickt man auf den Button hinterm Text bekommt man das Geld gut geschrieben welches in dem Text angegebn wurde.Danach verschwindet das Objekt.

Ich hab überhaupt keine Ahnung wie das mit deinen Wegen funktionieren soll die du mir zuletzt geschickt hast.Ich habe kein Script auf meinem Prefab. Ich habe ein Script welches mir die Buttons alle paar Sekunden erzeugt.Das Prefab ist einfach ein leeres Textfeld mit einem leeren Button dahinter.Nachdem Instantiate fülle ich den Text des Textfeldes("Hier 100 Euro"),mehr habe ich noch nicht. Ich möchte halt jetzt das der Button bei einem klick den Wert 100 auf das Konto addiert. Jedoch glaube ich das es sehr gut mit dem manuellen Weg(button.onClick.AddListener) funktioniert,da ich dort ja einen Variablenwert übergeben kann(wie bei deinem Beispiel "TuZeug(100)"). Das werde ich morgen ausprobieren.

Es wäre spitze wenn du mir deine neuen Ideen nochmal anhand meiner Scene genauer erklären könntest.Ich verstehe aber auch das das vielleicht zu aufwändig ist und zu viel Zeit kostet.Vielen Dank nochmal für deine Hilfe

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Strooja0108:

Ich habe kein Script auf meinem Prefab.

Musst halt eins bauen!

So als Beispiel:

public int moneyAmount;

public void Collect()
{
  Debug.Log(moneyAmount + " eingesammelt");
}

Das packst du auf deinen Prefab, bzw irgendwo da rein (auf den Button z.B.) und dann löst du einfach Collect() mit dem Button aus.

Jetzt kannst du mehrere Prefabs machen die verschiedene Dinge tun. Wenn du da mehr machen willst, oder evtl nur ein Prefab haben willst, ist es besser, dieses Script auf dem Prefab zu erweitern, als andere Scripts in den Prefabs rumpfuschen zu lassen.

private int moneyAmount;
public Text label;

private void Start()
{
  moneyAmount = Random.Range(10, 100);
  label.text = "Du hast " + moneyAmount + " gewonnen!";
}

public void Collect()
{
  Debug.Log(moneyAmount + " eingesammelt");
}

Wenn du das auf dein Prefab tust, den Text reinziehst und den Button Collect() auslösen lässt, dann bist du fertig!

Du kannst das Prefab sogar ohne dein Spawn-Script benutzen. Einfach mal zum Testen in die laufende Szene reinziehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ahhh okay das ergibt Sinn. Jetzt verstehe ich auch deinen Gedankengang ,danke schoen. Ich vermute das wird bei mir etwas kompliziert weil ich in meiner Version zu viele Prefabs haben muesste.Aber es ist gut zu wissen wie es sonst auch noch geht. Ich mache das jetzt gerade so das ich aus einer Liste einen Text random herauslese und je nach Text ,wird hinter dem Text unterschiedliche animierte Emojis angezeigt oder halt der Button. Das mit dem Button muss  ich halt noch ausprobieren(mit dem addlistener),hatte heute leider keine Zeit.Aber falls es nicht klappt komme ich dann vermutlich auf deine idee zurueck mit den unterschiedlichen Prefabs. Gibt es da irgendeinen Vorteil den ich gerade nicht sehe. Ich finde das eigentlich ganz angenehm ein Prefab zu haben und das einfach dann zu veraendern. Hat das extreme Nachteile?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Strooja0108:

Ich finde das eigentlich ganz angenehm ein Prefab zu haben und das einfach dann zu veraendern. Hat das extreme Nachteile?

Nö, das ist auch in Ordnung. Es bietet sich dann aber an, die Initialisierung der Prefab-Instanzen auf eine möglichst kleine Schnittstelle zu reduzieren. Anstatt also im onClick-Event des Buttons Dinge einzutragen, bei denen nur der Wert unterschiedlich ist, lieber die für die Prefabs geschriebene Komponente benutzen:

private int moneyAmount;
public Text label;


public void Initialize(int moneyAmount)
{
  this.moneyAmount = moneyAmount;
}

private void Start()
{
  label.text = "Du hast " + moneyAmount + " gewonnen!";
}

public void Collect()
{
  Debug.Log(moneyAmount + " eingesammelt");
}

und dann:

var instance = Instantiate(moneyWinningPrefab);
instance.Initialize(someAmountOfMoney);

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

brilliant exakt danach habe ich gesucht. Den oberen Teil aufs Prefab legen und den unteren kann ich dann von einem anderen Script aufrufen und direkt ein wert mitgeben. Ich weiss nicht warum ich darauf nicht gekommen bin,denke da fehlt mir die Erfahrung. Vielen dank fuer die ausfuehrliche Erklaerung. Ich werde heute Abend mal meine alte Variante hier reinschreiben nur um mal zu hoeren was du davon haelst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...