UniRx의 간단한 샘플 2(Where 및 Select)

8188 단어 UniRxUnityC#
UniRx의 간단한 샘플 사용 설명서
전면(Subscribe)
다음(First 및 Take)

첫 번째 필터 방법


IObservable와 IEnuumerable는 짝을 이루기 때문에 LINQ의 문법Where를 사용할 수 있습니다!
그 얘기 들었을 때 그렇게 생각했어.
하?
마음에 안 드는 말을 했는데 왜 LINQ가 나오는지 모르겠어요.
한결
제1회 카페 Extensions 개요 활용 방법
인터페이스의 성립 자체가 IEnumberable/IEnuumerator 인터페이스가 반전되어 있기 때문이다.
아아아아?
실제로 LINQ는 다양한 값을 추정할 수 있다고 한다.
그리고 반전 같은 건 신경 안 써도 돼.
많은 것을 사용한 후에 확실히 이해할 수 있다.
이해하지 못할 때 깊이 생각하면 나처럼 좌절하게 된다.
그럼 이번에는 Where와 Select 이야기.

미리 준비하다


이번부터 무브 메서드를 보유한 베이스 레벨을 정의해 계승한다.
(Rx 섹션 이외의 섹션을 생략하기 위해)
Base.cs
using UnityEngine;
public class Base : MonoBehaviour {
    /// <summary>
    /// (dx,dy)だけ移動させる
    /// </summary>
    /// <param name="dx"></param>
    /// <param name="dy"></param>
    public void Move (float dx,float dy) {
        gameObject.transform.position += new Vector3(dx, dy, 0);
    }
}
이번에는 지난번 Subsribe 대상 외에도 셀렉트, Where 대상을 제작했다.

빨간색은 Subscribe, 파란색은 Where, 녹색은 Select.
Where Sample와 Select Sample를 각각 붙인다.

Where


WhereSample은 이러한 코드입니다.
WhereSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class WhereSample : Base {

    // Use this for initialization
    void Start () {
        //Returnで(0,0.5)という値をSubscribe内に流し込んでる
        Observable.Return(new Vector2(0, 0.5f)).Subscribe(v => gameObject.transform.position = v);

        //Whereで左クリックの間しか値がプッシュされないようにしている
        this.UpdateAsObservable()
            .Where(_ => Input.GetMouseButton(0))
            .Subscribe(l => Move(0.01f, 0));
    }

}
초기에 위치가 바뀌었어요. 일단 놔두세요.
Update ASObservable () 다음에 Where (= > Input.GetMouseButon (0)) 이 끼어 있습니다.
이것은 LINQ의 Where이기 때문에 Input입니다.GetMouseButton(0)이 진짜일 때만 이곳을 통과할 수 있습니다.
이 값을 통해서만 Subscribe로 처리할 수 있습니다.
결과적으로 왼쪽 단추를 눌렀을 때만 오른쪽으로 이동한다.

Select


다른 한편, Select는 투영이 미뤄지는 방법이다.
SelectSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class SelectSample : Base {

    // Use this for initialization
    void Start () {
        //Returnで(0,1)という値をSubscribe内に流し込んでる
        Observable.Return(new Vector2(0, 1.5f)).Subscribe(v => gameObject.transform.position = v);

        //Selectを使って入力を加工してあげる
        this.UpdateAsObservable()
            .Select(_ => 2)
            .Subscribe(l => Move(0.01f * l, 0));
    }
}

이번에는 Update ASObservable 다음에 Select (l=>2) 를 끼고 있습니다.
이렇게 되면 유입된 값이 2가 된다.(지금까지 유닛형이라는 의미 없는 값을 넣었다.)
이후 Subscribe는 Subscribe(l=>Move(0.01f*l, 0)이다.0.01의 l배로 이동합니다.l==2로 인해 이동 속도가 0.01의 Subscribe보다 2배 빠르다.

시행해 보았다


그래서 결과는 이렇게 됐다.

이번에는 여기까지.

좋은 웹페이지 즐겨찾기