이진호의 개발 블로그

[Unity] UniRx 개념 및 사용법 정리 (1) 본문

Unity

[Unity] UniRx 개념 및 사용법 정리 (1)

l__j__h 2024. 3. 15. 15:29

※해당 문서는 아래 슬라이드를 정리하며 공부한 글입니다.

https://www.slideshare.net/agebreak/160409-unirx

 

[데브루키160409 박민근] UniRx 시작하기

[데브루키160409 박민근] UniRx 시작하기 - Download as a PDF or view online for free

www.slideshare.net

 


 

1. UniRx의 사용 예

(1) Update 사용을 최소화하자

UniRx의 Observable은 스트림을 통해 데이터를 계속 감시할 수 있습니다.

즉, 기존의 Update에서 사용하던 if문을 통한 캐릭터 이동, 점프 등을

UniRx를 통해 Awake/Start에서 단 몇줄의 코드를 선언하도록 개선할 수 있다는 것입니다.

 

기존의 방법 vs Observable을 사용한 UniRx식 방법 비교
private void Update(){
	if(canPlayerMove){
    	var inputVector = (new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")));
        
        if(inputVector.magnitude > 0.5f)
        {
        	Move(inputVector.normalized);
        }
        
        if(isGrounded && Input.GetButtonDown("Jump")){
        	Jump();
        }
    }
    
    if(ammoCount > 0){
    	if(Input.GetButtonDown("Attack")){
        	Attack();
        }
    }
}

⬆️ Observable화 하지 않은 기존의 방법. 차례대로 이동, 점프, 공격에 대한 코드를 다루는데, 코드를 이해하기 위해선 위에서부터 하나하나 되짚으며 흐름을 읽어야 합니다. 즉, 가독성이 Not good. 또한, 코드 수정 시, 흐름 속에서 어떤 부분을 수정해야 할지 헤맬 수도 있습니다.

 

private void Start()
{
	this.UpdateAsObservable()
    	.Where(_=>canPlayerMove)
        .Select(_=> new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")))
        .Where(input => input.magnitude > 0.5f)
        .Subscribe(Move);
        
    this.UpdateAsObservable()
    	.Where(_=>isGrounded && Input.GetButtonDwon("Jump"))
        .Subscribe(_=>Jump());
        
    this.UpdateAsObservable()
    	.Where(_=> ammoCount > 0 && Input.GetButtonDown("Attack"))
        .Subscribe(_=>Attack());
}

⬆️ Observable화 한 방법. 이동, 점프, 공격에 대한 코드를 기능별로 명시할 수 있어, 굳이 흐름을 읽는 수고를 들이지 않아도 됩니다. 따라서 수정도 편리합니다.

 

 

 

Observable로 변경하는 3가지 방법
UpdateAsObservable
지정한 GameObject에 연동된 Observable이 만들어집니다.
- GameObject의 Destroy때에 자동으로 OnCompleted가 실행됩니다.

Observable.EveryUpdate
- GameObject로부터 독립된 Observable이 만들어 집니다.
(따라서, GameObject가 Destroy 되더라도 OnCompleted가 실행되지 않습니다.)
- MonoBehaviour가 없는 곳이어도 사용 가능합니다.

ObserveEveryValueChanged
- Observable.EveryUpdate의 파생 버전
- 값의 변화를 매 프레임 감시하는 Observable이 생성됩니다.

 

+) 만약 Observable.EveryUpdate를 사용할 때, 해당 스트림에 대해 수명 관리를 하고 싶다면??

[SerializeField] private Text text;

private void Start()
{
	Observable.EveryUpdate()
    		.Select(_=> transform.position)
            .SubsribeToText(text)
            .AddTo(this.gameObject);
            //AddTo에 넘긴 GameObject가 Destroy되면, 이 Observable은 같이 Dispose 됩니다
            //단, Dispose된다고 해서 OnComplete가 호출되는 것은 아닙니다!!!
}

AddTo를 사용하면 됩니다.

 

(2) 컴포넌트를 스트림으로 연결하기

이어서...

728x90