首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

【Unity技艺】统一管理回调函数——观察者模式

2013-09-07 
【Unity技巧】统一管理回调函数——观察者模式这次的内容有点类设计模式里的观察者模式。但是和常规意义上的观

【Unity技巧】统一管理回调函数——观察者模式

这次的内容有点类似设计模式里的观察者模式。但是和常规意义上的观察者模式也不是完全一致,所以各位就不要咬文嚼字啦!咦?设计模式?!不懂!没关系,说不定你以前就用过。


开场白
我们来想象一个场景。在加载一个模型时,你需要从网上下载,但是你并不知道下载需要花费多少时间。你所知道的是,当下载完成后,就可以把模型放在特定位置上,开始游戏。那么,我们怎样才能判断下载完成呢?一个简单的方法是,在每一帧的时候都判断下载是否完成,完成后就可以继续后面的工作。因此,我们可以这样做,我们告诉一个管理器,嗨,你帮我盯着点,看下载完了没有,完了就叫我一声,好让我执行XXX函数。我们今天要做的,就是构造这样一个管理器。

实现注意,下面的代码依赖于之前所讲到的单例模式。
我们不防把上面这样一件工作成为一个计数器——Timer(这个名字可能不太恰当),把需要被通知者成为观察者——Oberver,而像下载管理器这样的对象成为一个主题——Subject。
首先,我们来定义观察者和主题对象。TimerObserverOrSubject.cs如下:
using UnityEngine;using System.Collections;public class TimerSample : TimerObserverOrSubject {private TimerController m_TimerCtr = null;private bool m_IsCanDisplay = false;private string m_DisplayContent = "Hello, candycat!";// Use this for initializationvoid Start () {m_TimerCtr = Singleton.getInstance("TimerController") as TimerController;//m_TimerCtr.SetTimer(this, Display, m_DisplayContent, 5);m_TimerCtr.SetTimer(this, Display, null, this, IsCanDisplay, null);StartCoroutine(DelayDisplay());}void Display(object arg) {if (arg == null) {Debug.Log(m_DisplayContent);} else {string content = arg as string;Debug.Log(content);}}bool IsCanDisplay(object arg) {return m_IsCanDisplay;}IEnumerator DelayDisplay() {yield return new WaitForSeconds(5.0f);m_IsCanDisplay = true;}// Update is called once per framevoid Update () {}}

首先,它向TimerController请求注册了一个计时器。这里,它的条件是IsCanDisplay函数,它返回bool值m_IsCanDisplay。而这个值将会在5秒后,通过协同函数DelayDisplay来由false置为true。当其为true时,TimerController就将通知TimerSample调用Display函数。
我们将第16行代码注释解开,并将18-20行代码注释掉,则可以达到相同的效果。

结束语
C#的委托机制还是非常常用的,使用Unity的童鞋最好还是了解一下。关于TimerController的执行效率,由于它是每一帧都要去判断所有的condition函数,所以应当让condition函数中的逻辑尽可能简单。
好了,这次就到这里,如果有更好的想法,或者这里的代码有什么问题,都非常欢迎指正。谢谢阅读!

热点排行