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는 Reactive Extensions for Unity의 약자이다.
Functional Reactive Programming(FRP) 를 C# 에 사용할 수 있게 만든 .Net Reactive Extensions 을 Unity 전용으로 최적화하여 공개한 라이브러리이다.
핵심 작동 원리
즉, 이벤트를 받으면 이걸 어떻게 가공하고 사용할지를 작성하는게 아니라 이벤트를 받기 전에 어떤 이벤트만 받고 싶은지를 작성하는 것이다.
IObserver : OnNext(), OnCompleted(), OnError() ----- 관찰자
IObservable : 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