ObserveEveryValueChanged

ObserveEveryValueChanged는 매 프레임마다 특정한 값의 변화를 관찰할 때 유용하게 사용할 수 있는 스트림 소스입니다.

CharacterController.isGround 값의 변화를 관찰해서 이 값이 true를 가지는 경우를 Rx를 사용해서 구현해 보도록 할께요.

매 프레임 Update 함수를 호출할 때마다 CharacterController.isGround의 값의 변화가 있는지를 살펴서 값이 true이면 "OnGrounded!" 라는 문자열을 출력한다고 하면 UpdateAsObservable을 사용해서 아래와 같이 처리할 수 있습니다.

// UpdateAsObservable () 를 사용하는 경우
UpdateAsObservable ()
    . Select ( _  =>  characterController . isGrounded )
    . DistinctUntilChanged ()
    . Where ( x  =>  x )
    . Subscribe ( _  =>  Debug . Log ( "OnGrounded!" ));

같은 처리를 ObserveEveryValueChange를 사용해서 처리하면 아래의 코드로 처리할 수 있습니다.

//ObserveEveryValueChange 를 사용하는 경우
characterController
    . ObserveEveryValueChanged ( x  =>  x . isGrounded )
    . Where ( x  =>  x ) // isGrounded 값의 변화가 있는 경우, 이 값이 True 이면 OnNext 메시지를 통지.  
    . Subscribe ( _  =>  Debug . Log ( "OnGrounded!" ));

UpdateAsObservable을 사용한 처리와는 달리 Select와 DistinctUntilChanged 연산자를 필요로 하지 않기 때문에 훨씬 더 간결하게 처리할 수가 있습니다.

ObserveEveryValueChange를 사용하는 경우의 코드가 훨씬 간결합니다.

정리하면 ObserveEveryValueChange 은 다음과 같은 특징을 가지고 있습니다.

  • 임의의 클래스 객체의 값의 변화를 관찰하는 용도록 사용한다. (해당 클래스가 MonoBehaviour 클래스를 상속한 클래스일 필요는 없다)
  • 이전 프레임과 비교해서 값의 변화가 있는 경우 OnNext 메시지를 통지한다.
  • 동일한 프레임 내에서 발생한 값의 변화는 감지하지 못한다.
  • 관찰 대상이 UnityEngine.Object를 상속하는 객체인 경우 Destory시 OnComplete 메시지를 통지한다.

results matching ""

    No results matching ""