Subject

Subject를 이용한 값의 통지

Subject를 이용하면 값을 발행하고 통지할 수 있다.

모니터링하는 대상에 값을 통지할 수 있다.

OnVisibleScript.cs

using  UnityEngine ;
using  UniRx ;
/// <summary>
/// 카메라에 찍힌 GameObject를 통지하는 스크립트
/// </ summary>
public  class  OnVisibleScript  :  MonoBehaviour
{
    /// <summary>
    /// 카메라에 비친 GameObject를 흘리는 스트림
    /// </ summary>
    Subject <GameObject>  onVisibleStream  =  new Subject <GameObject> ();

    /// <summary>
    /// 외부에 공개하는 Observable
    /// </ summary>
    public IObservable <GameObject>  OnVisibleObservable
    {
        get
        {
            return  onVisibleStream.AsObservable ();
        }
    }

    /// <summary>
    /// 카메라에 비칠 때 실행되는 Unity 콜백
    /// </ summary>
    public void OnBecameVisible ()
    {
        // OnNext에서 자신의 GameObject를 스트림에 보낸다.
        onVisibleStream.OnNext ( this.gameObject );
    }
}

ObserveScript.cs

using  UnityEngine ;
using  UniRx ;

/// <summary>
/// 대상을 감시하는 측면
/// </ summary>
public  class  ObserveScript  :  MonoBehaviour
{
    // 관측 대상의 GameObject
    public  GameObject  targetCube ;

    void  Start ()
    {
        // OnVisibleScript을 취득
        var  targetOnvisibleScript  =  targetCube . GetComponent < OnVisibleScript > ();

        // Subscribe 값에 가입
        targetOnvisibleScript . OnVisibleObservable
            . Subscribe ( x  =>  Debug . Log ( x ));
    }
}

이제 OnVisibleScript이 부여 된 GameObject가 카메라에 찍힌 순간에 OnVisibleObservable 값이 흐릅니다. OnVisibleObservable을 감시하고있다 ObserveScript가 그것을 감지하고 Debug.Log가 실행됩니다. OnNext ()이 값을 통지하거나 "Event를 발화하는"것과 같은 처리에 해당됩니다.

Subscribe ()가 기존의 Event에서 "EventHandler 등록"에 해당한다고 생각하세요. Event를 사용하는 경우 대리자를 정의하고 EvetnArgs을 정의하는 등 복잡한 처리가 많았 습니다만 UniRx 절대로 Subject를 정의하는 것만으로 매우 간단하게 쓸 수 있습니다.

이벤트 합성

using  UnityEngine ;
using  System.Collections ;
using  System.Linq ;
using  UniRx ;
using  System ;

public  class  ObserveScript  :  MonoBehaviour  {
    /// <summary>
    /// TargetCube들을 자식으로 가지는 GameObject라고 가정.
    /// </ summary>
    public  GameObject  cubes ;

    void  Start ()
    {
        // OnVisibleScript을 함께 취득
        var  onVisibleScripts  =  cubes.GetComponentsInChildren <OnVisibleScript> ();

        // Merge에서 여러 OnVisibleObservable을 하나로 통합
        var  allOnVisibleObservable  =  Observable
            .Merge ( onVisibleScripts.Select ( x  =>  x.OnVisibleObservable ));

        // 250ms 이내에 화면에 함께 찍힌 GameObject의 개수를 센다.
        allOnVisibleObservable
            .Buffer ( allOnVisibleObservable.Throttle ( TimeSpan.FromMilliseconds ( 250 )))
            .Subscribe ( x  =>  Debug.Log ( x.Count ));
    }

}

Observable.Merge()를 사용하여 여러 스트림을 하나의 스트림을 allOnVisibleObservable로 합성

// Merge에서 여러 OnVisibleObservable을 하나로 통합
var  allOnVisibleObservable  =  Observable
    . Merge ( onVisibleScripts.Select ( x  =>  x.OnVisibleObservable ));

Buffer는 이벤트들을 모으는 작업을 해제 이벤트가 올 때까지 계속 실행한다. Buffer 해제 ​​이벤트는 Throttle을 사용 생성합니다.

Throttle은 마지막으로 값이 와서 일정 시간이 경과하면 해제 이벤트를 통보한다. 이 경우에는 마지막 값이 온 후 250m 초 이상 지나면 Buffer를 해제한다. (즉, 250ms 이내에 화면에 비친 것은 동시에 비친 것으로 계산된다)

buffer
// 250ms 이내에 화면에 함께 찍힌 GameObject의 개수를 센다.
allOnVisibleObservable
    .Buffer ( allOnVisibleObservable.Throttle ( TimeSpan.FromMilliseconds (250)))
    .Subscribe ( x  =>  Debug.Log ( x . Count ));

results matching ""

    No results matching ""