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 메시지를 통지한다.