1

https://github.com/neuecc/UniRxで、

私は2つのオブザーバブルAとBを持っています。

A を B でフィルター処理したい

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

(Update1) これが実際のコードです。衝突するストリームで入力ストリームをキャンセルしようとしています。

    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

演算子だけを組み合わせるのは難しいです。

2 つのストリームは同期されていません。OnNext メッセージがストリーム B から送信されたとき、ストリーム A を遮断する時間はどれくらいですか? 次のストリーム B メッセージ? または次のストリーム A?

1コマだけ止めたいならこれはどう?

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 に答える