嗯嗯。
起初我从Unity过来,它里面是有个UniRx的,里面封装了对UGUI的各种绑定方法。还有相关计时器的方法。我入门就是这么入的,这个东西一旦用上了,整个编码习惯就改了,各种语言的编写可能都会先去找有没有相关的rx方式。尤其是游戏开发,几乎处处都在与“过程”打交道,有过程意味着异步。那这个东西,就是用来处理“异步过程”。(当然了,同步的操作也可以认为是一个0时间的“过程”,都可以融合进来)
构建轻量级mvp架构的基础就很方便,我几乎已经离不开它了,比如自己来个 ReactiveProperty。
另外,它为一个个动画过程或者逻辑上的时间多callback过程形成了代码描述。(比如一段“过程”(动画)就是一个Observable,你可以按照意愿去观察这个过程的都各个阶段,在处理各种复杂的叠加播放的“过程”(动画)时不要太爽。
再者,可以与promise的相互转化,也为网络异步的“过程”归入其管理提供了方便。
比如:
它里面的计时器相关部分核心可以封装一个采用引擎schedule的,就能做带类似 CCNextFrame().Subscribe(_ =>{});这样的计时器。
再比如封装creator的animation,那就更方便了,可以这样:
CCBindAnimationWithEvent(technicNode.getComponent(cc.Animation), null, null, ['over']).subscribe(_ => {
if (_.state == 'event') {
if (_.eventName == 'over') {
this.isKOLastTimeUp = true;
}
} else if (_.state == 'finished') {
PoolManager.getInstance().putNodeByKey('Technic_Surrender', technicNode);
}
});
再比如用引擎的tween+来造序列发射器
let CCTweenFloat = (duration: number, easing: { easing: any } = null) => {
return new Observable((observer: Observer<number>) => {
let obj = new Proxy({ t: 0 }, {
set: (target, key, value, receiver) => {
observer.next(value);
return Reflect.set(target, key, value, receiver);
}
});
let tween = cc.tween(obj).to(duration, { t: 1 }, easing).call(() => {
observer.complete();
}).start();
return () => {
tween.stop();
tween = null;
obj = null;
};
});
}
到最后发现rxjs用的越来越多,过程都变成了一个一个的Observable,就一利用rxjs的各种api给他们处理,比如处理成类似sequence,处理成类似spawn,可以筛选等等。