我使用UniRX插件在C#中使用Unity工作。对于那些不熟悉它的人来说,UniRX是一个C#Reactive扩展的实现,它被移植回C#.Net 2(这是Unity在5.3.5版本中使用的)。 我想要做的是从A类型的一个IObservable中获取数据,使用System.Func转换它,并自动将结果发布到B类型的新IObservable中。我写了几行代码来做到这一点但是我觉得这应该只是自动包含在Reactive扩展中的东西(但我无法找到在文档中调用的正确方法)。 我写的代码如下:
private class ObserverableBridge<TIn, TOut> {
public ReactiveProperty<TOut> outStream;
public ObserverableBridge(IObservable<TIn> input, System.Func<TIn, TOut> converter) {
this.outStream = new ReactiveProperty<TOut>();
input.Subscribe((inValue) => this.outStream.Value = converter(inValue));
}
}
public static IObservable<TOut> Bridge<TIn, TOut>(this IObservable<TIn> a, System.Func<TIn, TOut> converter) {
return new ObserverableBridge<TIn, TOut>(a, converter).outStream;
}
可以使用如下:
ReactiveProperty<float> input = new ReactiveProperty<float>(0.1f);
IObservable <int> output = input.Bridge((inFloat) => Mathf.RoundToInt(inFloat));
output.Subscribe((a) => { Debug.Log("a = " + a); });
for(int i = 1; i<3; i++) {
input.Value = i + 0.1f;
}
并产生如下输出:
a = 0
a = 1
a = 2
我感到好奇的是有一种方法可以在Reactive Extension中构建这种方法(在我看来应该这样),这样我就不需要使用自己的Bridge系统。
预先感谢您的协助!
答案 0 :(得分:0)
尝试Select()
:
ReactiveProperty<float> input = new ReactiveProperty<float>(0.1f);
input.Select<float, int>(Mathf.RoundToInt).Subscribe(a => Debug.LogFormat("a = {0}", a));