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

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

Share this post


Link to post
Share on other sites

Moin,

ich finde die delegate-Schreibweise sowieso etwas behämmert. Nimm einfach einen Lambda-Ausdruck, damit hatte ich noch nie Probleme:

button.onClick.AddListener(() => MeineMethode(parameter));

 

Share this post


Link to post
Share on other sites

Funktioniert das auch im Editor wenn  ich auf Play drücke?

Edit:

wenn ich das benutze, geht es nicht, benutze ich aber eine Methode die in der selben Klasse ist, geht es. Was muss ich ändern?

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

 

Share this post


Link to post
Share on other sites

"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());

 

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×