1

使用https://github.com/neuecc/UniRx

我有两个可观察的 A 和 B。

我希望 A 被 B 过滤。Sample似乎是我想要的,但它是负面的。

IObservable<long> A = Observable.EveryUpdate();            
IObservable<Collider2D> B = this.OnTriggerEnter2DAsObservable()
                .Where( x => x.gameObject.tag == "Wall");

我想要某种类似的伪代码:

A.filterBy(B)
 .Subscribe(x => Debug.Log(x)); //executed only when B is not streaming

(更新1)这是实际代码。我正在尝试用冲突流抵消输入流。

    var isCollidingWithWall = this.OnTriggerEnter2DAsObservable()
        .Where(collider => collider.gameObject.tag == "Wall");

    Func<long, float> displaceCalculate = (_) => this.Speed * Time.deltaTime;

    var moveLeft = Observable.EveryUpdate()
        .Where(_ => Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow));
    var moveRight = Observable.EveryUpdate()
        .Where(_ => Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow));

    var movement1 = moveLeft
        .Select(displaceCalculate)
        .Select(f => -f);

    var movement2 = moveRight
        .Select(displaceCalculate);

    movement2
        .Merge(movement1)
        .Subscribe(f =>
        {
            this.transform.position = new Vector2(this.transform.position.x + f, this.transform.position.y);
        });

我想我可能会走错方向。

4

3 回答 3

1

我只是想出了另一种方法。

    var streamB = this.OnTriggerEnter2DAsObservable().AsUnitObservable();

    this.UpdateAsObservable()
        .TakeUntil(streamB)
        .RepeatUntilDestroy(this)
        .Subscribe(_ =>
        {
            Debug.Log(Time.frameCount);
        });
于 2016-11-23T15:49:10.800 回答
1

很难只组合运算符。

两个流不同步。当 OnNext 消息来自流 B 时,关闭流 A 多长时间?下一个流 B 消息?或下一个流A?

如果你只想停止一帧,这个怎么样?

void Start()
{
    var isCollisionEntered = false;

    this.OnCollisionEnter2DAsObservable()
        .Where(x => x.gameObject.tag == "Wall")
        .Subscribe(_ => isCollisionEntered = true);

    this.LateUpdateAsObservable()
        .Where(_ => isCollisionEntered)
        .Subscribe(_ => isCollisionEntered = false);

    this.UpdateAsObservable()
        .Where(_ => !isCollisionEntered)
        .Subscribe(_ => Debug.Log("Do here"));
}

而且,我不推荐Observable.EveryUpdate。有必要管理生命周期。

我建议改用this.UpdateAsObservable(UniRx.Triggers)。它会自动OnCompleted在被销毁的游戏对象上发布消息。

于 2016-11-22T17:16:29.173 回答
0

您能否提供更多有关您尝试实现的实际游戏行为的背景信息?

我的猜测是,您尝试做的事情还有其他方法,而不必依赖EveryUpdate(例如,通过使用OnTriggerStayand/or OnTriggerExit)。

只是猜测示例运算符的“否定”是什么意思:您可能想看看pausable。不过,您必须生成正确的布尔值,而如何做到这一点实际上取决于您在此处实际尝试实现的游戏行为。

于 2016-11-22T17:30:39.887 回答