unity3d 使用委托+事件 完成低耦合发送消息

        最近在自学unity3d,看了网上的一些教学视频和小游戏按钮,感觉gameobject与gameobject 的消息传递,代码耦合性很强,因为我是开发as3的用的是面向对象的MVC思想,所以看到耦合性强的代码就有点强迫症去修改它,以下是用委托+事件做的一个低耦合的消息传递;不说废话,进入主题;


首先创建一个简单的场景,一个plane,放在上面的两个cube,其中一个cube(称为A)移动撞向另一个cube(称为B),撞了之后A向B发送 一个消息,能自定义消息的;


一个单例去保存委托和事件,(懂as3的朋友,这个单例相当一个事件的dispacter),代码如下

using UnityEngine;
using System.Collections;
///


/// 单例
///

public class EventDispacter{


//实例化单例
private static EventDispacter instance;


//定义委托事件,它定义了可以代表的方法的类型
/**碰撞检测*/
public delegate void CollisionHandler(DataType evt);
public event CollisionHandler CollisionHapend;  


private  EventDispacter(SingletonEnforcer enforcer){


}


public static EventDispacter getInstance()
{
if(instance==null)
{
instance=new EventDispacter(new SingletonEnforcer());
}
return instance;
}


public void sendCollisionHapend(DataType evt){
if(CollisionHapend!=null)CollisionHapend (evt);
}


}


class SingletonEnforcer {}



自定义消息的方法如下:

using UnityEngine;
using System.Collections;


public class DataType{
//定义委托事件发送消息的内容,或者其他东西
private string txt;

public string Txt{
get{return txt;}
set{txt=value; }
}
}


在A  cube这个物体的脚本中

using UnityEngine;
using System.Collections;


public class Cmain : MonoBehaviour {


//要传递的内容
private DataType d;


void OnTriggerEnter (Collider c){  
//print ("Cmaincrash");
//if (EventDispacter.getInstance().CollisionHapend) {
d = new DataType ();
d.Txt = "Success  to send a message!!";
   //发送事件
EventDispacter.getInstance().sendCollisionHapend(d);
//}
}  

// Update is called once per frame
void Update () {
transform.Translate (new Vector3 (1, 0, 0)*Time.deltaTime);
}
}

在B  cube中脚本如下:

using UnityEngine;
using System.Collections;


public class CSon : MonoBehaviour {


// Use this for initialization
void Start () {
//监听发送的事件
EventDispacter.getInstance().CollisionHapend+=dealFun;

}


// Update is called once per frame
void dealFun(DataType d) {
print (d.Txt);
}

void OnDestroy(){

  //移除发送的事件

//这个移除很重要,因为unity销毁的是只是自身的物体,对于这种事件的引用不会回收,如果销毁了该物体却不移除该事件监听的话则会提示

//该物体已经销毁却尝试去连接它,而且该事件监听一直会占着内存
EventDispacter.getInstance().CollisionHapend-=dealFun;

}


}



这样就完成了一个gameobject向另外一个或者多个gameobject发送消息,又不会产生强耦合的问题;

发这博文一是希望学unity3d的朋友觉得我哪里写得不好的话指出来,一起探讨,二是激励自己,自学需要动力啊

你可能感兴趣的:(Unity3d)