본문 바로가기
- Unity/let us all UNITE !

[Unity] Getting started with UniRX ( Observer Pattern )

by david_동근 2025. 5. 22.

UniRx

RX; Reactive Extensions로, Reactive Extensions for Unity 라이브러리입니다.
RX는 언어가 아닌 일종의 paradigm으로, 언어에 묶여있지 않아 C#, C++, Java, PHP, Lua 등에서도 사용 가능합니다.
RxJS, RxJava, RxPy, RxLua, 리액티브코코아 등등...
(Reactive 프로그래밍은 Asynchronous data stream으로, 이에 관해서는 다른 포스트에서 다루겠습니다.)
UniRx의 주요 개념으로 Observable, Stream → Operator, Subscribe 가 있으며,
Observable, Stream을 사용한 비동기의 개념으로, Overvation Pattern의 디자인 패턴을 따릅니다.
(2017년도, 제가 고딩때 나왔네요. 시간이 흐르고 UniRX에 대한 변화는 맨아래 참고 4 를 확인해주시면 좋을 거 같아요)
(UniRx를 사용하지 않고도, async/await 와 다른 라이브러리 병용이 낫다는 이야기에용)
 
제가 정리한 내용보다 더 자세한 설명이 아래 영상과 슬라이드에 나와있습니다.
박민근 (알콜코더) 개발자님의 공식 영상 링크입니다.
영상(공식) : https://www.youtube.com/watch?v=NN1_41TE1N0

소개(공식) : https://www.slideshare.net/agebreak/unite17-unirx

[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용

[Unite17] 유니티에서차세대프로그래밍을 UniRx 소개 및 활용 - Download as a PDF or view online for free

www.slideshare.net

 

RX는,

'Stream을 준비해서 Stream을 Operator로 가공해서 마지막에 Subscribe 한다.' 라는 개념입니다.
그래서 시간 측정 판정 처리와 변화하는 값의 감시 (Observer), 이벤트의 기다림과 비동기 처리에 사용한단 뜻 입니다.
예를 들어, 더블 클릭이나, 플레이어의 입력에 잠깐 대기 후 체크하는 경우,
네트워크에서 요청 및 응답 처리하는 경우, UI나 로직의 필드 값등을 변경하는 순간의 처리등이 있습니다.
Update() 대신 변화를 체크하는 용도로 사용할 수 있다는 뜻입니다.
UniRx의 코드들은 Awake() / Start() 에 한번 등록해두면 끝 입니다.
 

예시

Unity에서 더블 클릭을 구현하려면, 직접 클릭 시간 간격을 체크에 두번 연속의 입력을 판단하는 방식으로 코딩해야합니다.
(Unity에는 OnDoubleClick() 이라는 기본 제공 메서드가 없어용 ㅎㅎ)

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class DoubleClickUI : MonoBehaviour, IPointerClickHandler
{
    private float lastClickTime = 0f;
    private float doubleClickThreshold = 0.3f;

    public void OnPointerClick(PointerEventData eventData)
    {
        if (eventData.button != PointerEventData.InputButton.Left) return;

        float timeSinceLastClick = Time.time - lastClickTime;

        if (timeSinceLastClick <= doubleClickThreshold)
            Debug.Log("Double Click Detected!"); // 더블클릭 동작

        lastClickTime = Time.time;
    }
}

 
이렇게 작성하는 대신,

// 가장 먼저 Stream 정의, 매프레임 마우스 클릭 이벤트 Observe 할 거
var clickStream = UpdateAsObservable()
	.Where(_ => Input.GetMouseButtonDown(0));

// 200ms 사이 마우스 클릭 이벤트를 Buffer에 모으기
clickStream.Buffer(clickStream. Throttle (TimeSpan.FromMilliseconds (200)))
	.Where(x => x.Count >= 2) // 마우스 클릭 이벤트 2회 이상인 거 필터링
	.SubscribeToText(_text, X => // 위 조건 충족시, _text 에 출력
	string.Format("DoubleClick detected! \n Count: {0}", x.Count));

 
이런식으로 Query문으로 끝낼 수 있습니다.
 

Stream

타임라인에 배열돼 있는 이벤트의 시퀀스로, 이벤트의 흐름 그 자체가 Stream이며, 일종의 파이프 같은 것입니다.
코드 내에서는 IObservable<T> 로 취급합니다. (LINQ의 IEnumerable<T>에 해당해요)
이벤트 메세지에는 3종류가 있으며, 각각 OnNext, OnError, OnCompleted 입니다.
클릭할 때, 이벤트를 스트림에 보낸다고 생각하면,

자료 출처 : https://www.slideshare.net/agebreak/unite17-unirx

 

Subscribe

Stream의 말단에서 메세지가 올때 뭘 할 건지 정의합니다.
그래서 기본적으로 Subscribe 하지 않은 스트림은 동작하지 않습니다.
(OnError, OnComplete 가 오면 Stream은 종료돼요)

즉, Subscribe를 통해 IObservable<T> 은 IObserver<T>  에게 Stream의 변화를 알립니다.
 

Observer Pattern

관찰자 패턴의 기본적인 요소는 Subject(주제)와 Observer(관찰자)의 관계입니다.
Subject의 상태가 변화할 때, Observer에게 메세지를 보냅니다.
Observer는 그 변화를 관찰하다가 Subject로부터 메세지를 받으면 임무 수행 합니다.
 
UniRx에서 그 역할을 하는 인터페이스가 각각 IObservable<T>IObserver<T> 입니다.

IObservable<T> 

Subject의 역할을 담당하며, Observer 객체들이 자기를 Sunscribe하게 합니다.
상태가 변화할 때, Subscribe돼 있는 객체들에게 메세지를 보냅니다.

IObserver<T>

Observer의 역할이며, IObservable<T> 의 메세지를 관찰하고, 메세지를 받습니다.
 
아래는 일본의 개발자 neuecc님의 UniRx 라이브러리 주소입니다.
https://github.com/neuecc/UniRx

GitHub - neuecc/UniRx: Reactive Extensions for Unity

Reactive Extensions for Unity. Contribute to neuecc/UniRx development by creating an account on GitHub.

github.com

 
참고 3 : https://skuld2000.tistory.com/31#google_vignette

[UniRx 입문 강좌 1] 개념 및 기본 사용법 소개

[UniRx 입문 강좌 2] UniRx 의 핵심, Subject 와 Observable 사용 방법 [UniRx 입문 강좌 3] IObserver 메세지 종류와 스트림의 수명 관리 [UniRx 입문 강좌 4] Operator 활용(1) - Where & Select & SelectMany 사용법 [UniRx 입문

skuld2000.tistory.com

참고 4 : https://tech.lonpeach.com/2022/10/29/2022-unirx/

2022년 현재 UniRx의 용도 | Lonpeach Tech

환경

tech.lonpeach.com

 

UniRx는 요새는 많이 쓰지 않는 추세인가 봐요!
그래도 알아두면 좋을 거 같으니, 간단하게 살펴봅시다!
오늘도 좋은 하루 보내세요~ (๑>ᴗ<๑)

'- Unity > let us all UNITE !' 카테고리의 다른 글

[Unity] Asset Bundle & Addressables  (0) 2025.06.20
[Unity] Addressable #1 (Local)  (0) 2025.06.19
[Unity] Awake OnEnable Start  (0) 2025.05.17
[Unity] Update FixedUpdate LateUpdate  (0) 2025.05.16
[Unity] InputSystem 인풋시스템  (1) 2025.04.25