MustafGames Geschrieben 8. Oktober 2018 Melden Share Geschrieben 8. Oktober 2018 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 More sharing options...
Sascha Geschrieben 9. Oktober 2018 Melden Share Geschrieben 9. Oktober 2018 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)); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 9. Oktober 2018 Autor Melden Share Geschrieben 9. Oktober 2018 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()); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 9. Oktober 2018 Melden Share Geschrieben 9. Oktober 2018 "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 More sharing options...
MustafGames Geschrieben 10. Oktober 2018 Autor Melden Share Geschrieben 10. Oktober 2018 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 More sharing options...
Sascha Geschrieben 10. Oktober 2018 Melden Share Geschrieben 10. Oktober 2018 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 More sharing options...
MustafGames Geschrieben 11. Oktober 2018 Autor Melden Share Geschrieben 11. Oktober 2018 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 More sharing options...
Sascha Geschrieben 11. Oktober 2018 Melden Share Geschrieben 11. Oktober 2018 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 More sharing options...
MustafGames Geschrieben 11. Oktober 2018 Autor Melden Share Geschrieben 11. Oktober 2018 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 More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.