这里可能需要前期准备一下c#的委托(delegate)和事件(event)方面的知识了。。。
 不是很明白的,就各种谷歌吧~
 需要准备二个继承与MonoBehaviour的EventDispatcher类和EventListener类。
 我这里吧delegate就写在EventDispatcher里了,也可以新建一个类吧这些delegate存在里面,方便一点。。。
 
 
  
  //定义委托事件,它定义了可以代表的方法的类型
        
        /**事件*/
        public delegate void EventHandler(GameObject e);  
        /**碰撞检测*/
        public delegate void CollisionHandler(GameObject e,Collision c);
        /**触发器检测*/
        public delegate void TriggerHandler(GameObject e,Collider other);
        /**控制器碰撞检测*/
        public delegate void ControllerColliderHitHandler(GameObject e,ControllerColliderHit hit);
        /**新关卡被加载进来*/
        public delegate void LevelWasLoadedHandler(GameObject e,int level);  
  
 委托定义好了,其实这些就类似于方法参数一样。。。可意会不好言传啊。。。
 
 然后重写MonoBehaviour支持的那些时间响应函数:
 比如OnMouseDown();
 首先定义一个
EventHandler
 这个委托的事件。。。然后再OnMouseDown响应函数里对他进行操作。。
 
如果某个
GameObject
侦听了这个事件并写出了响应函数(响应函数即是定义
事件的
委托delegate
),那么在重写的
OnMouseDown函数类就会调用执行这个传进来的delegate并且把this.gameObject传出去。
 
 
  
  public event EventHandler MouseDown;  
        void OnMouseDown(){  
                if (MouseDown != null)  
                        MouseDown (this.gameObject); 
        }   
  
 复制代码
 
 
 以此类推,附上EventDispatcher类:
 
 
  
  using System;
using UnityEngine;  
/**  
*  基于MonoBehaviour的一个事件派发类 
* A simple event dispatcher - allows to listen to events in one GameObject from another GameObject
* 
* 
*  Usage: 
*  Add this script to the object that is supposed to dispatch events.  
*  In another objects follow this pattern to register as listener at intercept events:
  
    void Start () { 
        EventDispatcher ev = GameObject.Find("someObject").GetComponent<EventDispatcher>();
        ev.MouseDown += ListeningFunction; // Register the listener (and experience the beauty of overloaded operators!)
    } 
    void ListeningFunction (GameObject e) { 
        e.transform.Rotate(20, 0, 0); // 'e' is the game object that dispatched the event
        e.GetComponent<EventDispatcher>().MouseDown -= ListeningFunction; // Remove the listener
    } 
     
*  This class does not implement all standards events, nor does it allow dispatching custom events,  
*  but you shold have no problem adding all the other methods. 
* 
* date: 2013.8.21
*/  
public class EventDispatcher:MonoBehaviour{
        
        //定义委托事件,它定义了可以代表的方法的类型
        
        /**事件*/
        public delegate void EventHandler(GameObject e);  
        /**碰撞检测*/
        public delegate void CollisionHandler(GameObject e,Collision c);
        /**触发器检测*/
        public delegate void TriggerHandler(GameObject e,Collider other);
        /**控制器碰撞检测*/
        public delegate void ControllerColliderHitHandler(GameObject e,ControllerColliderHit hit);
        /**新关卡被加载进来*/
        public delegate void LevelWasLoadedHandler(GameObject e,int level);
                 
        
        
        
        public event EventHandler MouseEnter;  
        void OnMouseEnter(){  
                if (MouseEnter != null)  //如果有方法注册委托变量
                        MouseEnter(this.gameObject); //通过委托调用方法
        }
        
        public event EventHandler MouseOver;
        void OnMouseOver(){  
                if (MouseOver != null)  
                        MouseOver (this.gameObject); 
        }
        
        public event EventHandler MouseExit;  
        void OnMouseExit(){  
                if (MouseExit != null)  
                        MouseExit (this.gameObject); 
        }
        
        public event EventHandler MouseDown;  
        void OnMouseDown(){  
                if (MouseDown != null)  
                        MouseDown (this.gameObject); 
        }
        
        public event EventHandler MouseUp;  
        void OnMouseUp(){  
                if (MouseUp != null)  
                        MouseUp (this.gameObject); 
        }
        
        public event EventHandler MouseDrag;  
        void OnMouseDrag(){  
                if (MouseDrag != null)  
                        MouseDrag (this.gameObject); 
        }
        
        /**当renderer(渲染器)在任何相机上可见时调用OnBecameVisible*/
        public event EventHandler BecameVisible;  
        void OnBecameVisible (){  
                if (BecameVisible != null)  
                        BecameVisible (this.gameObject);  
        }  
        /**当renderer(渲染器)在任何相机上都不可见时调用OnBecameInvisible*/
        public event EventHandler BecameInvisible;  
        void OnBecameInvisible (){  
                if (BecameInvisible != null)  
                        BecameInvisible (this.gameObject);  
        }  
        public event EventHandler Enable;
        void OnEnable(){
                if(Enable != null)
                        Enable(this.gameObject);
        }
        public event EventHandler Disable;
        void OnDisable(){
                if(Disable != null)        
                        Disable(this.gameObject);
        }
         public event EventHandler Destroy;
        void OnDestroy(){
                if(Destroy != null)
                        Destroy(this.gameObject);
        }
        /**在相机渲染场景之前调用*/
        public event EventHandler PreRender;
        void OnPreRender(){
                if(PreRender != null)
                        PreRender(this.gameObject);
        }
        /**在相机完成场景渲染之后调用*/
        public event EventHandler PostRender; 
        void OnPostRender(){
                if(PostRender != null)
                        PostRender(this.gameObject);
        }
        /**在相机场景渲染完成后被调用*/
        public event EventHandler RenderObject; 
        void OnRenderObject(){
                if(RenderObject != null)
                        RenderObject(this.gameObject);
        }
        
        
        public event EventHandler ApplicationPause; 
        void OnApplicationPause(){
                if(ApplicationPause != null)
                        ApplicationPause(this.gameObject);
        }
        /**当玩家获得或失去焦点时发送给所有游戏物体*/
        public event EventHandler ApplicationFocus; 
        void OnApplicationFocus(){
                if(ApplicationFocus != null)
                        ApplicationFocus(this.gameObject);
        }
        public event EventHandler ApplicationQuit; 
        void OnApplicationQuit(){
                if(ApplicationQuit != null)
                        ApplicationQuit(this.gameObject);
        }
        
        
        
        public event TriggerHandler TriggerEnter;
        void OnTriggerEnter(Collider other){
                if(TriggerEnter != null)
                        TriggerEnter(this.gameObject,other);
        }
        public event TriggerHandler TriggerExit;
        void OnTriggerExit(Collider other){
                if(TriggerExit != null)
                        TriggerExit(this.gameObject,other);
        }
        public event TriggerHandler TriggerStay;
        void OnTriggerStay(Collider other){
                if(TriggerStay != null)
                        TriggerStay(this.gameObject,other);
        }
        
        public event ControllerColliderHitHandler controllerColliderHit;
          void OnControllerColliderHit(ControllerColliderHit hit){
                if(controllerColliderHit != null)
                        controllerColliderHit(this.gameObject,hit);
        }
        
    public event CollisionHandler CollisionEnter;  
    void OnCollisionEnter (Collision c){  
        if (CollisionEnter != null)  
            CollisionEnter (this.gameObject, c);  
    }  
         public event CollisionHandler CollisionStay;  
    void OnCollisionStay (Collision c){  
        if (CollisionStay != null)  
            CollisionStay (this.gameObject, c);  
    }  
        
    public event CollisionHandler CollisionExit;  
    void OnCollisionExit (Collision c){  
        if (CollisionExit != null)  
            CollisionExit (this.gameObject, c);  
    }
        
        public event LevelWasLoadedHandler LevelWasLoaded;
        void OnLevelWasLoaded(int level){
                if(LevelWasLoaded != null)
                        LevelWasLoaded(this.gameObject,level);
        }
}    
  
 
写好了派发事件的类拖到需要派发事件出来的组件上,然后再来注册和侦听吧,下面写出EventListener类做出侦听的步骤。。
 首先需要获取目标组件上的EventDispatcher组件。
 
 
  
  private EventDispatcher evt = null;
        
        // Use this for initialization
        void Start () {
                evt = GameObject.Find("Cube1").GetComponent<EventDispatcher>();
        }   
  
 复制代码
 获取到目标对象后,就要将本地的响应函数,添加到
EventDispatcher
 的事件 委托里去。
 
 
  
  /**注册侦听器函数*/
        void addEventListener(){
                //给委托的事件类型变量赋值
                evt.MouseDown +=OnMouseDownListener;
                evt.MouseDrag += OnMouseDragLIstener;
        }  
  
 复制代码
 
evt.MouseDown 可以简单的理解成一个delegate,+= 将本地函数(delegate规定的类型和参数)赋值进去,当然了解除监听就用 -= 啦~~
 
 完了再写出处理函数。。。
 
 
  
  /**事件响应处理函数
         * @param GameObject e 事件源的GameObject对象
         * <li> 事件响应函数的参数,参见EventDispatcher类中的相应事件Handler的参数个数
         * */
        void OnMouseDownListener(GameObject e){
                print("on mouse down..");
                e.transform.Rotate(20, 0, 0);
                //移除侦听函数
                e.GetComponent<EventDispatcher>().MouseDown -= OnMouseDownListener;
        }
        
        void OnMouseDragLIstener(GameObject e){
                print("on mouse drag..");
        }
复制代码
附上EventListener源码:
using UnityEngine;
using System.Collections;
/**
* 响应事件
* */
public class EventListener : MonoBehaviour {
        
        private EventDispatcher evt = null;
        
        // Use this for initialization
        void Start () {
                evt = GameObject.Find("Cube1").GetComponent<EventDispatcher>();
                addEventListener();
        }
        /**注册侦听器函数*/
        void addEventListener(){
                //给委托的事件类型变量赋值
                evt.MouseDown +=OnMouseDownListener;
                evt.MouseDrag += OnMouseDragLIstener;
        }
        
        // Update is called once per frame
        void Update () {
        
        }
        /**事件响应处理函数
         * @param GameObject e 事件源的GameObject对象
         * <li> 事件响应函数的参数,参见EventDispatcher类中的相应事件Handler的参数个数
         * */
        void OnMouseDownListener(GameObject e){
                print("on mouse down..");
                e.transform.Rotate(20, 0, 0);
                //移除侦听函数
                //e.GetComponent<EventDispatcher>().MouseDown -= OnMouseDownListener;
        }
        
        void OnMouseDragLIstener(GameObject e){
                print("on mouse drag..");
        }
        
}  
  
 。。代码码玩了,绑定到响应的Cube上去试试吧~~~
 
 
 
 完成了。。。
 
 
 有问题,大家一起研究,一起学习,一起进步~~