Subject<T> 是UniRx 推荐的 事件实现方式 ( UniRx是AssetStore上的一款免费插件,但其实他的出身很地道,脱胎于微软的Rx框架,主要思想是像Linq那样对订阅的事件进行操作,并且他还能对操作进行 时间调度,线程调度,而UniRx就是Rx的Unity版) 。在开发中,这种数据发射工作(在使用UniRx时,可以把事件触发时调用观察者回调并传递参数的行为 形象的理解成发射,这样有助于理解万物皆Stream的这种编程思想),一般会让订阅方和发射方解耦,彼此不用了解对方的存在,SubjectManager的意义就在于此。 此系统中,用继承于SubjectArgs基类的一个一个子类来表示不同的事件,同时类本身作为事件传递的参数类型,你可以在里面随便定义任何你需要在这种事件里传递的数据
下面是实现
//主题参数基类
public abstract class SubjectArgs
{
public object sender = null;
public abstract int SubjectId { get; }
}
//主题管理器
public class Subject_Manager {
//主题字典,以主题传递的参数类型提供的hashCode为key
private Dictionary<int, Subject<SubjectArgs>> mSubjectDic = new Dictionary<int, Subject<SubjectArgs>>();
//通过id拿到主题
public IObservable<T>