UniRx용 단순 샘플 3(First 및 Take)

7926 단어 UniRxUnityC#
UniRx의 간단한 샘플 사용 설명서
전면(Where 및 Select)
다음(Skip 및 SkipWhile)

첫 번째 방법밖에 없어요.


Rx의 편리한 기능이 되었습니다.
이번에는 IEnumberable의 LINQ에서 빈도가 높지 않은 First와 Take입니다.
(특히 Take는 사용해 본 적이 있나...?)
Rx를 한 번 돌리면 매우 편리한 방법이 된다.
이런 것들은 처음 한 번만 실행하고 싶거나 처음 몇 번만 실행하고 싶을 때 활발하다.
예를 들어 상대방이 첫 번째 발송 버튼만 반응했으면 좋겠어요.
예를 들어, HP가 0일 때 처리하지 않으려는 객체
이런 데서 사용할 수 있어요.

미리 준비하다


예를 들어 TakeWhile, Take, First를 만들고 각각의 Sample 스크립트를 붙인다.

First


First는 프레임 100 이후 한 번에 1.5f 오른쪽으로만 이동하는 객체입니다.
코드 여기 있어요.
FirstSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class First : Base
{

    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1f);

        //クリックされたら右に1.5動かす(但し1回だけ)
        this.UpdateAsObservable()
            .First(l => Input.GetMouseButton(0))
            .Subscribe(l => Move(1.5f, 0));
    }
}

이번부터 바로 초기 위치로 대입한다.
First(Func predicate)를 사용하면 지정된 predicate와 일치하는 값을 처음 누릅니다.
그러니까 인풋.GetMouseButton(0)이 트루로 변경되면 객체는 1.5f를 한 번만 이동합니다.
(First에는 Where와 함께 또는 활동을 처음 수행할 수 있는 매개변수 없이 과부하가 있습니다.

Take


그 다음에 Take는 처음 몇 번의 요구만 처리하고 싶다고 대답할 것이다.
여기는 100Frame 사이에서만 0.01f를 이동합니다.
TakeSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class TakeSample : Base {

    // Use this for initialization
    void Start () {
        gameObject.transform.position = new Vector2(0, 0.5f);

        //Takeで最初の100回以外はカット
        this.UpdateAsObservable()
            .Take(100)
            .Subscribe(l => Move(0.01f, 0));
    }

}


Take(int n)는 처음 n번만 밀어냅니다.
실제로 다음 TakeWhile을 소개하지는 않았지만 TakeUnitil 같은 건 더 많이 쓸 것 같아요.

TakeWhile


TakeWhile은 지정된 기준에 따라 실제 기간 값을 지속할 수 있는 편리한 방법입니다.
이번에 제작된 것은 x가 2를 넘기 전에 오른쪽으로 이동하는 게임오브젝트입니다.
TakeWhileSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class TakeWhile : Base
{
    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1.5f);

        //Takeでxが2を超えたらそれ以降はカット
        this.UpdateAsObservable()
            .TakeWhile(l => gameObject.transform.position.x <= 2)
            .Subscribe(l => Move(0.01f, 0));
    }

}

TakeWhile(Func predicate)은 predicate가 일치할 때까지 흐르는 값을 계속 누릅니다.
그래서 상술한 코드는 l=>gameObject입니다.transform.position.x<=2를 만족시키기 전에 Subscribe에 가지만 그 다음 값은 Subscribe에 전달할 수 없습니다. 결과적으로 x==2 정도가 운행을 중지합니다.

실행 결과


따라서 각 대상의 정지 위치는 이렇다.

이번에는 여기까지.

좋은 웹페이지 즐겨찾기