Tabu Geschrieben 17. September 2021 Melden Share Geschrieben 17. September 2021 Hallo liebe Community, ich habe ein Problem und kann beim besten Willen nicht den Fehler finden. Das Event wird nur bei bestimmten Objekten gesendet. Auf der Console erhalte ich aber immer die Meldung "Trigger". Irgendwie sehe ich den Wald vor lauter Bäumen nicht 😞 Auslöser des Events: using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjektInfo : MonoBehaviour { public InvObjekt meinObjekt; public int munition=0; private GuiAnzeige inventory; public event Action guiAktualisierung; void OnTriggerEnter2D(Collider2D other) { if(other.gameObject.tag=="Player") { guiAktualisierung?.Invoke(); // obwohl der Rest funktioniert, wird es nicht immer ausgelöst Debug.Log("Trigger");// kommt immer auf der Console an inventory=GameObject.Find("Inventar").GetComponent<GuiAnzeige>(); for (int i=0;i<inventory.inventorys.Length;i++) { if (inventory.inventorys[i]==null) { inventory.inventorys[i]=meinObjekt; if(meinObjekt.istWaffe) inventory.invPatronen[i]=munition; Destroy(gameObject); break; } } } } } Empfänger des Events: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GuiAnzeige : MonoBehaviour { public InvObjekt[] inventorys; public int[] invPatronen; public bool objektNeu; private ObjektInfo aktualisierungUi; void Start() { aktualisierungUi=FindObjectOfType<ObjektInfo>(); aktualisierungUi.guiAktualisierung += EmpfangeUpdateEvent; } void EmpfangeUpdateEvent() { Debug.Log("Event empfangen"); Hier kommt es nicht immer an } Ich habe schon testweise über die Update-Methode in der ObjektInfo die Events abgefeuert und das ging tadellos... Von der Logik kann ich es nicht nachvollziehen... Hat jemand eine Idee? Danke Tabu Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 17. September 2021 Melden Share Geschrieben 17. September 2021 vor 40 Minuten schrieb Tabu: Das Event wird nur bei bestimmten Objekten gesendet. Verstehe ich das richtig - du hast mehrere ObjektInfo-Komponenten in der Szene? Dann ist das Problem klar: aktualisierungUi=FindObjectOfType<ObjektInfo>(); Das hier gibt dir eins davon zurück. Bei diesem einen fügt dein Code dann eine Reaktion auf dessen Event hinzu. Alle anderen Objekte haben danach immer noch leere Events. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tabu Geschrieben 17. September 2021 Autor Melden Share Geschrieben 17. September 2021 Hallo Sascha, ok, dann bin ich beruhigt und doch nicht verrückt 🙂 Wie kann ich das denn verhindern? Vielen Dank Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 17. September 2021 Melden Share Geschrieben 17. September 2021 Du hast da ein grundlegendes Problem in der Logik. Deine Anzeige ist dafür gemacht, auf das Event eines einzelnen Objekts zu reagieren. Es ist außerdem etwas ungewöhnlich, dass das UI sich bei den Objekten meldet und nicht umgekehrt. Du könntest einfach statt lauter überall verteilter Events ein einziges Event definieren. Wenn du das im UI machst, brauchst du dafür nicht einmal mehr ein Event: public class GUIDisplay : MonoBehaviour { private static GUIDisplay instance; private void Awake() { if (!instance) { instance = this; } else { Destroy(gameObject); } } public static void Refresh() { instance.DoStuff(); } private void DoStuff() { // ... } } Und dann rufst du das so auf: GUIDisplay.Refresh(); Dieses Pattern wird in Unity-Kreisen oft als "Singleton" bezeichnet, obwohl es nicht wirklich eines ist. Es hat einige Nachteile, weswegen man es auf lange Sicht meistens (wenn auch nicht immer!) vermeiden möchte. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tabu Geschrieben 17. September 2021 Autor Melden Share Geschrieben 17. September 2021 Hallo Sascha, vielen Dank. Du hast Recht, das macht alles wenig Sinn. Ich baue das mal ein wenig um. Macht es Sinn einem Objekt nur das ScriptableObjekt für die Werte zuzuordnen? So z.B.: using UnityEngine; public class ObjektInfo : MonoBehaviour { public InvObjekt meinObjekt; } Dann würde ich beim Aufnehmen nur die Daten des Objektes übernehmen und dann z.B. im Inventarsystem speichern. Das Aufsammeln etc. würde ich dann über ein Script im Player machen und das Gui aktualisieren. Vielen Dank Tabu Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 17. September 2021 Melden Share Geschrieben 17. September 2021 Kann ich wirklich nicht sagen, dazu habe ich zu wenig Ahnung von deinem Projekt. Allgemein sind ScriptableObjects super, um im Editor Daten in andere Objekte einzuspeisen. Z.B. welches Item eine Truhe beim looten gibt oder zu welcher Klasse von Gegenständen ein auf dem Boden liegendes Item gehört. Vielleicht ist das hier ja so ein Fall. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tabu Geschrieben 17. September 2021 Autor Melden Share Geschrieben 17. September 2021 Das Objekt kann eine Waffe oder ein anderes Item sein. Die Verarbeitung der Daten läuft dann durch ein anderes Script z.b. für das Aufsammeln beim Player. Aber um das Sprite mit den entsprechenden Daten (z.B. Gewicht, Gattung etc.) zu füttern, habe ich das mit ScriptableObjects gemacht. 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.