这里以一个简单的示例来验证事件机制的可行性,我们在场景中有一个球体,默认这个球体的颜色为白色,通过调整界面中的RGB数值,可以改变球体的颜色,在这个示例中UI是事件发送者,负责UI中Slider控件的数值发生变化时向球体发送消息,传递的数据类型是Color类型;球体为事件接收者,负责注册事件及接收到消息后的处理。因为代码较为简单,所以这里写在一个脚本中:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UniEventDispatcher;
public class Example : MonoBehaviour
{
///
/// R数值的Slider
///
private Slider sliderR;
///
/// G数值的Slider
///
private Slider sliderG;
///
/// B数值的Slider
///
private Slider sliderB;
void Start ()
{
//在接收者中注册事件及其回调方法
NotificationCenter.Get().AddEventListener("ChangeColor", ChangeColor);
//在发送者中分发事件,这里以UI逻辑为例
sliderR = GameObject.Find("Canvas/SliderR").GetComponent();
sliderG = GameObject.Find("Canvas/SliderG").GetComponent();
sliderB = GameObject.Find("Canvas/SliderB").GetComponent();
//注册UI事件
sliderR.onValueChanged.AddListener(OnValueChanged);
sliderG.onValueChanged.AddListener(OnValueChanged);
sliderB.onValueChanged.AddListener(OnValueChanged);
}
public void OnValueChanged(float value)
{
//获得RGB数值
float r = sliderR.value;
float g = sliderG.value;
float b = sliderB.value;
//分发事件,注意和接收者协议一致
NotificationCenter.Get().DispatchEvent("ChangeColor", new Color(r, g, b));
}
///
/// 改变物体材质颜色
///
///
public void ChangeColor(Notification notific)
{
Debug.Log(notific.ToString());
//设置颜色
renderer.material.color = (Color)notific.param;
}
}
该示例运行效果如下:
小结
虽然目前这个事件机制在实现和使用上没有什么问题,可是从扩展性和可优化性上来考虑,这个设计目前存在以下问题:
* 字符型的键名使用起来方便,可是对通知者和接收者由1个以上的人力来维护的时候双方需要通过沟通来确定键名,可以考虑使用GameObject或者Transform来替代现在的键名设计,可是这种设计带来的新问题是会增加不同模块间的GameObject或者Transform的相互引用。
* 通知者和接收者在传递参数和接受参数的时候需要分别进行装箱和拆箱,所以这并非一个优秀的设计,同时需要双方保证传递的参数类型一致。解决方法是针对不同的类型对通知中心进行派生或者考虑对通知中心提供泛型约束,这样做的目的是使Notification中的通知内容变成具体的类型,这样就可以解决目前需要进行装箱和拆箱而带来的性能问题。到这里今天的Unity3d教程之基于订阅者模式实现事件机制就结束了。喜欢的多多关注我们吧。
推荐阅读:南京unity3d培训,选丝路让你赢高薪
还有什么问题没解决的?点击【咨询专业老师】想要咨询相关课程点击【课程咨询】