Advertisement
Guest User

Unity C# Event System

a guest
Nov 11th, 2013
754
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.22 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class EventDispatcher : ScriptBase
  6. {
  7.     Dictionary<EventId, EventDelegate> events = new Dictionary<EventId, EventDelegate>();
  8.     Dictionary<System.Delegate, EventDelegate> internalLookup = new Dictionary<Delegate, EventDelegate>();
  9.  
  10.     public void RegisterCallback<T>(EventId id, EventDelegate<T> callback) where T : EventArgs
  11.     {
  12.         EventDelegate internalDelegate = (e) =>
  13.             {
  14.                 var convert = (T)e;
  15.                 callback(convert);
  16.             };
  17.         internalLookup[callback] = internalDelegate;
  18.  
  19.         EventDelegate handler;
  20.         if (events.TryGetValue(id, out handler))
  21.         {
  22.             events[id] = handler += internalDelegate;
  23.         }
  24.         else
  25.         {
  26.             this.events[id] = internalDelegate;
  27.         }
  28.     }
  29.     public void DeregisterCallback<T>(EventId id, EventDelegate<T> callback) where T : EventArgs
  30.     {
  31.         EventDelegate internalDelegate;
  32.         if (internalLookup.TryGetValue(callback, out internalDelegate))
  33.         {
  34.             EventDelegate containingDelegate;
  35.             if (events.TryGetValue(id, out containingDelegate))
  36.             {
  37.                 containingDelegate -= internalDelegate;
  38.                 if (containingDelegate == null)
  39.                 {
  40.                     events.Remove(id);
  41.                 }
  42.                 else
  43.                 {
  44.                     events[id] = containingDelegate;
  45.                 }
  46.             }
  47.             internalLookup.Remove(callback);
  48.         }
  49.     }
  50.     public void RaiseEvent<T>(EventId id, T eventArgs, bool needsListener = true) where T : EventArgs
  51.     {
  52.         EventDelegate del;
  53.         if (events.TryGetValue(id, out del))
  54.         {
  55.             del.Invoke(eventArgs);
  56.         }
  57.         else if (needsListener)
  58.         {
  59.             Debug.LogWarning("Trying to raise an event with ID <" + id.ToString() + "> with no listeners on " + this.gameObject.name);
  60.         }
  61.     }
  62. }
  63.  
  64. public delegate void EventDelegate<T>(T e) where T : EventArgs;
  65. public delegate void EventDelegate(EventArgs e);
  66.  
  67. public enum EventId
  68. {
  69.     Damaged,
  70.     Died,
  71.     AbilityCast,
  72.     Healed,
  73. //  Etc.
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement