Unity

[라이브러리] R3 Reactive Extensions (Rx) - 2

CCS_Cheese 2026. 4. 23. 14:03

초기 설정 및 기본 개념은 이전 게시글을 참고해 주시기 바라며, 이번 게시글에서는 프레임 기반 연산 (FrameProvider)에 대해 다루겠습니다.

R3 기본 개념 및 패키지 설치

 

프레임 기반 연산

  • IntervalFrame()
  • EveryUpdate()
  • DelayFrame()
  • DebounceFrame()

 

IntervalFrame

이름에서 알 수 있듯이, 특정 프레임 간격(Interval)으로 이벤트를 발생시킬 수 있도록 도와주는 메서드입니다.
IntervalFrame(프레임 수) 형태로 작성하며, 지정한 프레임 주기에 맞춰 주기적으로 로직을 반복 실행할 때 활용합니다.

 

예시 코드

Observable.IntervalFrame(60)
            .Subscribe(_ => Debug.Log("60 프레임마다 실행됩니다.")).AddTo(this);
위 예시 코드는 60프레임 주기로 로그를 출력합니다. AddTo(this)를 명시하여 해당 게임 오브젝트가 파괴되거나 해제될 때 자동으로 이벤트 구독이 취소되도록 안전하게 구성했습니다. (이벤트 해제 및 컴포넌트 수명 관리에 대해서는 추후 별도로 다룰 예정입니다.)

 

 

EveryUpdate

유니티의 내장 콜백인 Update(), FixedUpdate()처럼 매 프레임마다 이벤트를 발행하는 메서드입니다. 주로 매 프레임 단위로 사용자 입력을 체크하거나, 조건 연산자(Where)를 결합하여 특정 상황에서만 데이터를 통과시킬 때 사용합니다.

 

예시 코드

Observable.EveryUpdate()
            .Subscribe(_ => Debug.Log("매 프레임마다 실행됩니다.")).AddTo(this);
실제 유니티의 Update() 메서드 내부에서 코드를 실행하는 것과 동일한 주기로 작동하는 것을 확인할 수 있습니다.

DelayFrame

이벤트를 지정된 프레임 수만큼 지연(Delay)시킨 후 처리할 수 있도록 돕는 메서드입니다.
DelayFrame(프레임 수) 형태로 작성하며, 이벤트가 감지된 시점으로부터 명시된 프레임이 지난 후에 다음 파이프라인으로 데이터를 전달하여 로직을 실행합니다.

 

예시 코드

 Observable.EveryUpdate()
            .Where(_ => Input.GetMouseButtonDown(0))
            .DelayFrame(10)
            .Subscribe(_ => Debug.Log("마우스 클릭 후 10프레임 지연되어 실행되었습니다."))
            .AddTo(this);
매 프레임 마우스 좌클릭 입력을 감지하다가, 클릭 이벤트가 발생하면 그 시점으로부터 정확히 10프레임이 지난 후에 로직(로그 출력)을 지연 실행하는 방식입니다.

 

DebounceFrame

디바운스(Debounce)는 연속적으로 발생하는 이벤트를 그룹화하여, 마지막 이벤트가 발생한 후 일정 기간 동안 추가 입력이 없을 때만 이벤트를 통과시키는 기법입니다. DebounceFrame은 이를 프레임 단위로 적용하여, 이벤트 발생 후 지정한 프레임 수 동안 추가 이벤트가 발생하지 않아야만 최종적으로 정해진 로직을 한 번 실행시킵니다.

 

예시 코드

Observable.EveryUpdate()
            .Where(_ => Input.GetMouseButtonDown(1)) // 우클릭
            .DebounceFrame(140)
            .Subscribe(_ => Debug.Log("우클릭 연타 후 30프레임 동안 입력이 없어 최종 1회만 실행되었습니다."))
            .AddTo(this);
우클릭을 감지한 뒤, 140프레임 동안 추가적인 우클릭이 발생하지 않아야만 최종 로직을 실행합니다. 만약 이벤트가 통과하기 전(140프레임 이내)에 다시 우클릭이 입력되면 대기 프레임 카운트가 초기화되어 다시 기다리게 됩니다. 이러한 패턴은 버튼의 무분별한 연타를 방지하거나, 불필요한 중복 API 호출 제한, 혹은 UI 창 크기 조절이 완전히 끝났을 때만 레이아웃을 업데이트하는 등 최적화 작업에 자주 활용됩니다.

 

실행 로그

실행 로그

위 예시 코드들을 종합하여 실행해 보면, 기본적으로 EveryUpdateIntervalFrame에 의해 매 프레임 및 특정 프레임 주기로 로그가 지속 출력됩니다. 또한 마우스 입력을 감지한 뒤 지정된 프레임만큼 실행이 지연되거나, 연속 입력이 필터링(Debounce)되어 의도한 타이밍에 정확히 이벤트가 발생하는 것을 로그를 통해 확인할 수 있습니다.