- Home /
 
CSharpNotificationCenter Posting Messages with data
Hey guys, I am using the CSharpNotificationCenter and i cant work out how to attach some data to my message that i am posting. There isn't really any examples on the Wiki. Could someone help me out here? The example given on the wiki does not (unfortunetly) send any data. When I try to send a hashtable in Post to a function listening that accepts a HAshtable, I get an error: MissingMethodException: The best match for method ErrorDialogue has some invalid parameter.
Answer by BjoernS · Jan 15, 2013 at 12:02 PM
for me this solution worked:
 * Example use Post Notification / AddObserver with data:
  * 
  * 1) Example use Post Notification:
  * 
     // Post Notification with data:
     Hashtable hashtable = new Hashtable();
     hashtable.Add("attribute1", 1000);
     hashtable.Add("attribute2", 55);    
     NotificationCenter.DefaultCenter.PostNotification(this, "OnBumperCollision", hashtable);
  * 
  *  2) Example AddObserver and reuse posted data of Notification:
  * 
     using UnityEngine;
     using System.Collections;
     public class testObserveB : MonoBehaviour {
         void Start () {
             NotificationCenter.DefaultCenter.AddObserver(this, "OnBumperCollision");
         }
         void OnBumperCollision (Notification note)
         {
             Debug.Log("OnBumperCollision detected!");
             // reuse data if it exists
             if (note.data!=null) {
                 Debug.Log("Sender="+note.sender.name);
                 Debug.Log("Data:");
                 foreach (DictionaryEntry entry in note.data)
                 {
                     Debug.Log(" "+entry.Key +"="+ entry.Value);
                 }
             } else {
                 Debug.Log("data is null.");
             }
         }    
     }
 
               but befor this can work, the Notification class must be accessible from outside:
     public class Notification {
      
             //public Notification (GameObject aSender, string aName, Hashtable aData)
             //{
             //    throw new System.NotImplementedException ();
             //}
      
         public Component sender;
         public string name;
         public Hashtable data;
         public Notification (Component aSender, string aName) { sender = aSender; name = aName; data = null; }
         public Notification (Component aSender, string aName, Hashtable aData) { sender = aSender; name = aName; data = aData; }
      
      
     }
 
               this was not the case with the script in the wiki...
Answer by studio1h · Jan 13, 2015 at 02:46 AM
To send/access a notification's data parameter you must first send some data along with your notification:
 NotificationCenter.DefaultCenter.PostNotification(this, "OnPlayerEnter", someVectorThree);
 
               Then:
 void Start()
     {
         NotificationCenter.DefaultCenter.AddObserver(this, "OnPlayerEnter");
     }
 
 void OnPlayerEnter(NotificationCenter.Notification note)
     {
         Vector3 someVectorThree = note.data;
     }
 
              Answer by Kryptos · Jul 25, 2012 at 12:02 PM
I never used this script, but it looks like of a custom implementation of delegates, which are supported by Unity. I would like to know the advantage of using this script instead of built-in delegates (after my first read of the community page I didn't see any).
See: delegate (C# Reference) and Delegates (C# Programming Guide)
See also: Delegates Tutorial
edit: I think that the receiving method should have this kind of signature:
 void MethodName(object arg)
 {
     // cast inside the method
     Hashtable hash = arg as Hashtable;
     if (hash == null)
     {
         // error
     }
 }
 
               But I'm not sure since I never used Unity built-in messaging system (which is the final step of this implementation).
here is a good description of the benifits i suppose. I really like the messaging system, it is indeed a custom implementation of delegates, but it follows the observer pattern.
I will take a look at it after work. Thanks for the info.
Did anyone get any further with this? I'm trying to use the C# version of NotificationCenter and I'm also stuck on how to send data.
I have not figured out how to send data (The script above does not work), but have been successful with this:
http://wiki.unity3d.com/index.php?title=CSharp$$anonymous$$essenger_Extended
Answer by BjoernS · Jan 15, 2013 at 12:02 PM
 public class Notification {
  
     public Component sender;
     public string name;
     public Hashtable data;
     public Notification (Component aSender, string aName) { sender = aSender; name = aName; data = null; }
     public Notification (Component aSender, string aName, Hashtable aData) { sender = aSender; name = aName; data = aData; }
  
  
 }
 
              Your answer