profile image

L o a d i n g . . .

반응형

UniRx?

Reactive Extensions

  • C#용 비동기 처리를 위한 라이브러리
  • 디자인 패턴 중 하나인 Observer 패턴을 기반으로 설계되어 있음
  • 시간에 관한 처리, 실행 타이밍이 중요한 곳에서 쉽게 작성할 수 있도록 되어 있음
  • 완성도가 높고, Java, JavaScript, Swift 등 다양한 언어로 포팅되어 있음

UniRx

  • Reactive Extensions for Unity
  • Unity C#에 최적화되어 있음
  • Unity 개발에 유용한 기능이나 Operator가 추가적으로 구현되어 있음
  • ReactiveProperty 등이 추가되어 있음
  • 철저하게 성능 튜닝이 진행되어서 원래 .Net Rx보다 메모리 퍼포먼스가 좋음

 

Subscribe

Rx란?

  • C# : 다기능 event
  • web: 다기능 jQuery

⇒ 버튼이 클릭되면 무언가 처리를 한다, 버튼에 마우스가 hover 되면 색이 바뀐다 등…

  • Rx를 구성하는 부분은 두 가지이다.

처리의 흐름

button.Click += button_Click;
  • 클릭된다면 무엇을 하고 싶은지, 몇 초후에 어떤 걸 하고 싶은지 등… 특정 이벤트가 일어나면 하고 싶은 것을 뜻한다.
  • Observer 패턴의 Listener

처리를 실행하는 오브젝트

  • 이 처리 흐름에 값을 넣어, 실제로 처리를 실행하는 객체를 뜻한다.
  • 버튼을 누르면 이벤트를 발생해 주는 곳.
  • Observer 패턴의 Observer

Rx란?

  • 위의 두 가지를 합쳐서
    1. 옵저버에 처리 흐름을 등록한다.
    2. 해당 이벤트가 일어나면, 처리 흐름에 값을 넣어서 처리해 준다.

  • 해당 개념은 C#에 이미 존재하는 기능이며, ‘이벤트(Event)’라고 부른다.
  • 중요한 것은 Rx가 이벤트의 연장으로 볼 수 있다는 것이다!
  • 무슨 일이 일어나면, 이벤트가 일어나는 플로우를 그대로 적용할 수 있다.
  • 이벤트에는 없는 편리한 기능들이 탑재되어 있다.

샘플

  • Start하면 GameObject를 이동시키는 처리를 UniRx를 통해 진행해 보자!

SubscribeSample.cs

using UnityEngine;
using UniRx;

public class SubscribeSample : MonoBehaviour {
    void Start () {
        //Return으로 (0, 1, 0)이라는 값을 Subscribe 안으로 흘려 보내 준다.
        Observable.Return(new Vector3(0, 1, 0))
                .Subscribe(v => gameObject.transform.position = v);
    }
}

  • 우선 값을 흘려 보내는 곳은 Observable.Return(new Vector3(0, 1, 0)) 이다.
  • Observable.Return(T value)는 value를 등록된 처리에 한 번만 푸시한다.
  • 다음은 Subscribe로 등록한다.
  • Subscribe에서는 인수(v)가 위치 정보라는 것을 기대하고, gameObject의 position을 해당 위치로 변경한다.
  • 등록처.Subscribe(Action onNext) 에서 등록처에 onNext라는 처리를 등록하겠다는 것이다. 이는 C# event의 +=에 대응한다.
using UnityEngine;
using UniRx;
using UniRx.Triggers;

public class SubscribeSample : MonoBehaviour {
    void Start () {
        // Return을 통해 (0, 1, 0)이라는 값을 Subscribe 안으로 흘려 보내 준다.
        Observable.Return(new Vector3(0, 1, 0))
                .Subscribe(v => gameObject.transform.position = v);
        
        // UpdateAsObservable로 Update마다 값을 넣어 준다.
        // update 이벤트는 없지만... this.update += _ => Move(0.01f, 0, 0);
        this.UpdateAsObservable().Subscribe(_ => Move(0.01f, 0, 0));
    }

    public void Move(float dx, float dy, float dz) {
        gameObject.transform.position += new Vector3(dx, dy, dz);
    }
}

전체 코드 : https://github.com/Knabin/UniRx-Study/blob/main/Assets/Scripts/SubscribeSample.cs

 

GitHub - Knabin/UniRx-Study

Contribute to Knabin/UniRx-Study development by creating an account on GitHub.

github.com

 

  • this.UpdateAsObservable()는 업데이트마다 처리를 실행하는 등록자이다.
  • 참고로 thisUniRx.Triggers.ObservableTriggerExtensions;로 정의되는 확장 메소드이기 때문에 생략할 수 없다.

 

 

해당 포스트는 다음의 포스트를 보며 개인 기록용으로 메모하였습니다. 양질의 지식을 제공해 주신 Marimoiro 님께 감사드립니다.

https://qiita.com/Marimoiro/items/186ce9215325229a8d8b

 

UniRxのシンプルなサンプル その1(Subscribe イベントの登録) - Qiita

UniRxのシンプルなサンプルの取扱説明書 前(Rx オーバービュー) 次(WhereとSelect) UniRxの簡単なサンプル ずっとRxって気になってたんですけどいろんなサイトの説明難しかったので全然勉強できて

qiita.com

 

반응형
복사했습니다!