Jump to content
Unity Insider Forum

AddListener funktioniert nicht


Recommended Posts

Grüße,

seit ich Unity Heute gestartet habe und nichts verändert habe geht auf einmal folgendes nicht mehr:

https://docs.unity3d.com/ScriptReference/UI.Button-onClick.html

der delegate funktioniert nicht.

 

private UnityAction action_harvest;

action_harvest += hit.transform.GetComponent<Tree>().CmdHarvestTree;
harvest.GetComponent<Button>().onClick.AddListener(action_harvest);

das funktioniet aber, leider ohne Argument.

 

Kann mir jemand sagen warum das so ist?

 

Mfg Mustaf

Link zu diesem Kommentar
Auf anderen Seiten teilen

"Geht nicht" ist wie immer eine unzureichende Fehlerbeschreibung, aber ich rate einfach mal drauf los.

Versuch mal, die Tree-Komponente vorher zu besorgen und direkt die Referenz in den Lambda-Ausdruck zu stecken:

var tree = hit.transform.GetComponent<Tree>();
harvest.onClick.AddListener(() => tree.CmdHarvestTree());

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, funktioniert leider auch nicht, damit meine ich das es keine Funktion ausführt, wenn ich eine normale Methode aus dem selben Script nehme klappt es.

 

Edit:  Habe nun eine neue Methode im Script erstellt, welche die andere ausführt, geht das auch mit 2 Argumenten?

Edit2: Macht es etwas aus wenn eins der Argumente ein GameObject ist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb MustafGames:

geht das auch mit 2 Argumenten?

Alles, was du ganz normal ausführen kannst, kannst du auch in einen Lambda-Ausdruck packen. Bei mehreren Anweisungen müssen nur geschweifte Klammern her.

vor 2 Stunden schrieb MustafGames:

Macht es etwas aus wenn eins der Argumente ein GameObject ist?

Nein.

Worauf du achten musst ist, dass bei einem Lambda-Ausdruck nicht die aktuellen Werte übergeben werden (pass by value), sondern Variablen (pass by reference).

Wenn du sowas machst:

var i = 10;
Action foo = () => Debug.Log(i);
i = 500;
foo();

dann wird 500 ausgegeben, nicht 10. Schau also mal, ob du noch irgendwelche Variablen änderst, nachdem du AddListener ausgeführt hast.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, die Parameter ändern sich nicht nachdem ich AddListener nutze, oder gilt das auch bei der nächsten Ausführung der ganzen Methode die AddListener benutzt?

 

Ich glaube ich schreibe einen eigenen Script der dann reagiert wenn ein Sprite geklickt wird, da der Button Script irgendwie spinnt, das sollte dann funktionieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb MustafGames:

oder gilt das auch bei der nächsten Ausführung der ganzen Methode die AddListener benutzt?

Wenn du eine Variable übergibst und diese innerhalb ihrer Lebenszeit noch irgendwann einmal ihren Wert ändert, dann gilt der neue Wert von dann an auch für deine anonyme Methode.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Problem erkannt, Problem noch nicht gebannt.

Es liegt daran das ich eine Command Methode rufen möchte.

Das AddListener erstmal ignorieren:

public void OnPointerUp (PointerEventData eventData) {
        switch (typ) {
            case "Item":
                GetComponent<Player>().inv.CmdAddItem(int.Parse(target.transform.name.Replace("Item_", "")), 1);
                NetworkServer.Destroy(target);
                break;
            case "Harvest":
                Debug.Log("test");
                target.GetComponent<Tree>().CmdHarvestTree();
                break;
        }
    }

So sieht die Methode am Script aus welcher kein NetworkBehaviour ist sondern Mono.

Kann man da trotzdem einen Cmd auführen, den Debug.Log wird ausgeführt (siehe Konsole) aber die Zeile CmdHarvestTree nicht?

Weißt du was ich meine?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...