最近在自学unity3d,看了网上的一些教学视频和小游戏按钮,感觉gameobject与gameobject 的消息传递,代码耦合性很强,因为我是开发as3的用的是面向对象的MVC思想,所以看到耦合性强的代码就有点强迫症去修改它,以下是用委托+事件做的一个低耦合的消息传递;不说废话,进入主题;
首先创建一个简单的场景,一个plane,放在上面的两个cube,其中一个cube(称为A)移动撞向另一个cube(称为B),撞了之后A向B发送 一个消息,能自定义消息的;
一个单例去保存委托和事件,(懂as3的朋友,这个单例相当一个事件的dispacter),代码如下
using UnityEngine;
using System.Collections;
/// <summary>
/// 单例
/// </summary>
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的朋友觉得我哪里写得不好的话指出来,一起探讨,二是激励自己,自学需要动力啊