I cant subscribe to my event manager ? What should I do?
This is my event manager
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class EventRegister: MonoBehaviour
{
#region Singelton
private static EventRegister _current;
public static EventRegister Current
{
get
{
if (_current == null)
{
GameObject go = new GameObject("EventRegister");
go.AddComponent<EventRegister>();
}
return _current;
}
}
#endregion
[SerializeField]
private string subscribedEvent = string.Empty;
public delegate void RegisteredEvent();
public static event RegisteredEvent OnReceivedEvent;
public static Dictionary<string, List<EventRegister>> eventRegister = new Dictionary<string, List<EventRegister>>();
private void Awake()
{
_current = this;
EventRegister.SubscribeEvent(this);
}
private void OnDestroy()
{
EventRegister.UnsubscribeEvent(this);
}
public void ReceiveEvent()
{
if (OnReceivedEvent != null)
{
OnReceivedEvent();
}
}
public static void SendEvent(string eventName)
{
if (eventName == string.Empty)
{
return;
}
if (EventRegister.eventRegister.ContainsKey(eventName))
{
List<EventRegister> list = EventRegister.eventRegister[eventName];
foreach (EventRegister eventRegister in list)
{
eventRegister.ReceiveEvent();
}
}
}
public void SwitchEvent(string eventName)
{
EventRegister.UnsubscribeEvent(this);
this.subscribedEvent = eventName;
EventRegister.SubscribeEvent(this);
}
public static void SubscribeEvent(EventRegister register)
{
string key = register.subscribedEvent;
List<EventRegister> list;
if (EventRegister.eventRegister.ContainsKey(key))
{
list = EventRegister.eventRegister[key];
}
else
{
list = new List<EventRegister>();
EventRegister.eventRegister.Add(key, list);
}
list.Add(register);
}
public static void UnsubscribeEvent(EventRegister register)
{
string key = register.subscribedEvent;
if (EventRegister.eventRegister.ContainsKey(key))
{
List<EventRegister> list = EventRegister.eventRegister[key];
if (list.Contains(register))
{
list.Remove(register);
}
if (list.Count <= 0)
{
EventRegister.eventRegister.Remove(key);
}
}
}
}
This is my enemy I want to subscribe to the event manager I am able to send the string as event
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy: MonoBehaviour
{
// Enemy Life System Variables
private float _enemyLife = 20f;
void FixedUpdate()
{
//enemy life system
EnemyLifeSystem();
}
//enemy life system
void EnemyLifeSystem()
{
// kill enemy
if (_enemyLife <= 0)
{
DeathEvent();
KillEnemy();
}
}
public void DeathEvent()
{
EventRegister.SubscribeEvent();
EventRegister.SendEvent("Die");
}
// kill enemy
public void KillEnemy()
{
Destroy(_enemyGO);
}
}
This is the listener Don't mind the name
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DebugScripts : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
EventRegister.OnReceivedEvent += this.Setup;
}
// Update is called once per frame
void Update()
{
}
public void Setup()
{
Debug.Log("Yaooooo ");
}
}
Naw I don't know how to subscribe to the event any solutions?
Answer by UDN_91f40d40-a815-4544-a03d-4cfb546d77eb · Apr 08, 2020 at 01:36 PM
For short, you need to add EventRegister.Current.SwitchEvent("Die"); before EventRegister.SendEvent("Die");
However, From your Event manager, shows that in order to subscribe an Event, you need to pass in an EventRegister. But your EventRegister is a Singleton. Which you will only be having one instance of the Class. Which mean no matter what is the event string you sent, as long as the subscribedEvent is same, all event subscribe in the EventRegister.OnReceivedEvent will be trigger.
,For short, you need to add EventRegister.Current.SwitchEvent("Die"); before EventRegister.SendEvent("Die");
However, From your Event manager, shows that in order to subscribe an Event, you need to pass in an EventRegister. But your EventRegister is a Singleton. Which you will only be having one instance of the Class. Which mean no matter what is the event string you sent, as long as the subscribedEvent is same, all event subscribe in the EventRegister.OnReceivedEvent will be trigger.
Your answer
Follow this Question
Related Questions
How to use Unity Events and Unity Actions [Subs&UnSubs] 0 Answers
How do I switch from * Input.GetAxis () * to UI buttons? 0 Answers
Question regarding delegates and events 1 Answer
Instance variables and this == null in event handler 1 Answer
Argument Exception when no arguments? Method Arguments are Incompatible 0 Answers