unity study #5 - UniRx

·2022년 9월 3일
0

Unity Study

목록 보기
5/8

unity 스터디를 하며 공부한 내용을 기록하기 위한 게시글 입니다. 오타 또는 오류가 있을 수 있습니다.

업무에서 사용할 도구 study 중 UniRX가 활용되어 개념을 정리해보고 이해하고자 한다.

옵저버 패턴

한 객체(Subject, Observable)의 상태가 바뀌면, 그 객체에 의존하는 다른 객체들 (Observers)한테 연락(notify)이 가고 자동으로 갱신(update)되는 방식으로 일대다(one-to-many)의존성을 정의한다.

즉, 관찰 대상 주제(Subject)의 상태가 업데이트되면, 등록된 Observer들에게 바뀐 상태 notify를 주고, Observer들은 이벤트를 받아 처리한다.
Reactive의 기반이 되는 중요한 디자인 패턴이다.
Reactive Programming은 특정 데이터나 이벤트에 반응하는 프로그래밍 방식이기 때문이다.

// 이벤트를 발생하는 핵심 인스턴스
// Subject<T>형태로 원하는 자료형을 Subject타입의 인스턴스를 생성하면,
// UniRx의 스트림을 사용할 수 있다.
// Subject는 IObservable(구독) 과 IObserver(발행)를 구현하고 있다.
private Subject<string> m_OnDuplicateDirectory = new Subject<string>();

// 이벤트의 구독자에게만 공개하겠다.
public IObservable<string> ObserveDuplicateDirectory() => m_OnDuplicateDirectory.AsObservable(); // 옵저버

UniRx

UniRx는 Reactive Extensions for Unity의 약자이다.
Functional Reactive Programming(FRP) 를 C# 에 사용할 수 있게 만든 .Net Reactive Extensions 을 Unity 전용으로 최적화하여 공개한 라이브러리이다.

핵심 작동 원리

  1. 스트림(Stream) 을 정의한다.
  2. 오퍼레이터(Operator) 로 스트림의 데이터를 가공한다.
  3. 가공된 데이터를 통지 (Subscribe) 받아서 우리의 로직에 태운다.

즉, 이벤트를 받으면 이걸 어떻게 가공하고 사용할지를 작성하는게 아니라 이벤트를 받기 전에 어떤 이벤트만 받고 싶은지를 작성하는 것이다.

  • Subject
    Subject형태로 원하는 자료형을 Subject타입의 인스턴스를 생성하면 UniRx의 스트림을 사용할 수 있다.
  • Subscribe
    메시지 수신 시 실행을 함수에 등록한다.
  • Observer, IObservable
    메시지 발행을 위한 IObserver 인터페이스와 메시지 구독을 위한 IObservable 인터페이스가 제공된다.

IObserver : OnNext(), OnCompleted(), OnError() ----- 관찰자
IObservable : Subscribe() ----- 관찰 가능한

  • OnNext
    메세지를 전달한다. IObserver 가 OnNext 를 통해 IObservable 의 Subscribe 에 이벤트를 전달하는 개념. (subscribe에 등록된 함수에 메세지를 전달하고 실행)

FileView.cs

 public class FileView
 {
  	// stream을 선언
	private Subject<string> m_OnSaveFile = new Subject<string>();
  
  	// 구독을 위해 stream을 AsObservable로 관찰
	public IObservable<string> ObserveSaveFile() => m_OnSaveFile.AsObservable();

	public void SaveFile()
    {
  		// onNext를 사용해서 stream에 메세지 전달
    	var dirPath = "path정의";
    	m_OnSaveFile.OnNext(dirPath);
    }
 }

ViewerWindow.cs

public class ViewerWindo : EditorWindow
{
	FileView m_FileView;
    string contentString = default;
    
    void OnEnable()
    {
  		// stream 을 subscribe 하여 최종적으로 무엇을 할지 작성
    	m_FileWiew.ObserveSaveFile()
        	.Subscribe(dirPath =>
            {
            	File.WriteAllText(dirPath, contentString);
            }
    }
    
    void OnGUI()
    {
    	if(GUILayout.Button("Save")
        {
        	m_FileView.SaveFile();
        }
    }
}

참고자료
https://mentum.tistory.com/512
https://skuld2000.tistory.com/31
https://luv-n-interest.tistory.com/1095

profile
삶을 스스로 통제하고 있다는 느낌을 받을 때 더 행복하고 성공한다.🍃

0개의 댓글