본문 바로가기
Dev/Unity

UniRx_vs_UniTask

by wenect 2023. 11. 26.

UniRx와 UniTask를 사용목적에 따라 잘 사용하기 위해 정리해봅니다.

UniRx와 UniTask는 둘 다 유니티 게임 개발에서 사용되는 라이브러리이며, 비동기 및 이벤트 기반 프로그래밍을 용이하게 하기 위해 설계되었습니다. 그러나 그들의 주요 초점과 구현 방식에는 몇 가지 차이점이 있습니다.

공통점
비동기 프로그래밍 지원: 두 라이브러리 모두 유니티에서 비동기 프로그래밍을 지원합니다. 이는 게임의 메인 스레드를 차단하지 않으면서 긴 작업을 처리할 수 있게 해줍니다.
유니티 최적화: UniRx와 UniTask는 모두 유니티의 특정한 요구사항과 성능에 맞춰 최적화되어 있습니다.
코드의 단순화: 복잡한 비동기 로직이나 이벤트 처리를 더 간단하고 관리하기 쉬운 방식으로 작성할 수 있도록 돕습니다.

차이점
기본 개념 및 방식:
UniRx: .NET의 Reactive Extensions(Rx)를 기반으로 하며, 이벤트 스트림과 데이터 플로우를 관리하는 방식에 중점을 둡니다. 데이터 스트림에 대한 연산자를 제공하여 이벤트와 비동기 데이터 플로우를 관리합니다.
UniTask: C#의 async와 await 패턴을 기반으로 하며, 주로 비동기 작업을 단순화하는 데 초점을 맞춥니다. 유니티의 Coroutine과 유사하지만, 더 효율적인 메모리 관리와 성능을 제공합니다.

사용 사례:
UniRx: 복잡한 이벤트 처리, 사용자 입력 스트림, 시간에 따른 이벤트 처리 등에 적합합니다.
UniTask: 단일 비동기 작업이나 연속적인 비동기 작업의 흐름을 관리할 때 유용합니다. 예를 들어, 네트워크 요청, 데이터 로딩 등의 작업에 적합합니다.

성능:
UniRx: 스트림 기반의 데이터 처리가 중요할 때 좋은 성능을 발휘합니다.
UniTask: Coroutine에 비해 메모리 할당과 성능면에서 더 우수하며, 간단한 비동기 작업에 더 적합합니다.
결론적으로, UniRx와 UniTask는 유니티 게임 개발에서 비동기 및 이벤트 기반 프로그래밍의 다양한 요구사항을 충족시키기 위해 공존하며 사용됩니다. 개발자의 요구사항에 따라 두 라이브러리를 선택적으로 혹은 함께 사용할 수 있습니다.


 

// 플레이어 입력 스트림
var moveInput = this.UpdateAsObservable()
    .Select(_ => Input.GetAxis("Horizontal"))
    .Where(x => x != 0);

moveInput.Subscribe(x => MoveShip(x)); // 우주선 이동 처리

// 더블 탭 감지
this.UpdateAsObservable()
    .Where(_ => Input.GetKeyDown(KeyCode.Space))
    .Buffer(this.UpdateAsObservable().Throttle(TimeSpan.FromMilliseconds(250)))
    .Where(xs => xs.Count >= 2)
    .Subscribe(_ => PerformSpecialMove()); // 특수 기동 실행
async UniTask LoadLevelData(string levelName)
{
    ShowLoadingScreen();
    var levelData = await LoadLevelDataAsync(levelName); // 비동기 데이터 로딩
    InitializeLevel(levelData);
    HideLoadingScreen();
}

// 예: 데이터 로딩 함수
async UniTask<LevelData> LoadLevelDataAsync(string levelName)
{
    // 데이터 로딩 로직
    await UniTask.Delay(TimeSpan.FromSeconds(2)); // 네트워크 지연 시뮬레이션
    return new LevelData(); // 가상의 데이터 반환
}

 

'Dev > Unity' 카테고리의 다른 글

Unity_Chart  (0) 2024.01.21
Excel to SQLite  (0) 2023.09.07
오브젝트의 축 정렬하기(Quaternion.FromToRotation, Quaternion.LookRotation)  (0) 2023.05.05
Google.Protobuf  (1) 2023.04.27

댓글