这次的内容有点类似设计模式里的观察者模式。但是和常规意义上的观察者模式也不是完全一致,所以各位就不要咬文嚼字啦!咦?设计模式?!不懂!没关系,说不定你以前就用过。
开场白
我们来想象一个场景。在加载一个模型时,你需要从网上下载,但是你并不知道下载需要花费多少时间。你所知道的是,当下载完成后,就可以把模型放在特定位置上,开始游戏。那么,我们怎样才能判断下载完成呢?
一个简单的方法是,在每一帧的时候都判断下载是否完成,完成后就可以继续后面的工作。因此,我们可以这样做,我们告诉一个管理器,嗨,你帮我盯着点,看下载完了没有,完了就叫我一声,好让我执行XXX函数。我们今天要做的,就是构造这样一个管理器。
实现
注意,下面的代码依赖于之前所讲到的单例模式。
我们不防把上面这样一件工作成为一个计数器——Timer(这个名字可能不太恰当),把需要被通知者成为观察者——Oberver,而像下载管理器这样的对象成为一个主题——Subject。
首先,我们来定义观察者和主题对象。
TimerObserverOrSubject.cs如下:
using UnityEngine;
using System.Collections;
public class TimerObserverOrSubject : MonoBehaviour {
virtual protected void OnDestroy ()
{
if(Singleton.IsCreatedInstance("TimerController"))
{
(Singleton.getInstance("TimerController") as TimerController).ClearTimer(this);
}
}
}
TimerObserverOrSubject.cs的内容非常简单,它的工作就是在该脚本被析构时,及时地从计数器管理器里面删除涉及这个对象的所有Timer。
计数器管理器的脚本——
TimerController.cs如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class TimerController : MonoBehaviour {
public delegate void OnCallBack(object arg);
public delegate bool OnIsCanDo(object arg);
public class Timer {
public TimerObserverOrSubject m_Observer;
public OnCallBack m_Callback = null;
public object m_Arg = null;
public TimerObserverOrSubject m_Subject;
public OnIsCanDo m_