Jump to content
Unity Insider Forum

Event löst nicht immer aus


Tabu

Recommended Posts

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

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

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

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

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

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

Archiviert

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

×
×
  • Neu erstellen...