코루틴, 동기 / 비동기, UniTask

김도익·2023년 5월 11일
0

Unity

목록 보기
20/23
post-thumbnail

23.05.11. 코루틴 수업, UniTask

UniTask - 노션, 활용 방법

코루틴(Coroutine)

코루틴은 함수를 호출했을 때 전부 다 실행하지 않고 중간중간 실행했으면 좋겠다 라는 생각에 개발되었다.
현대 언어에서 코루틴은 정말 중요하다.
그래서 우린 코루틴을 숨쉬듯이 다룰줄 알아야한다.
함수는 중단 재개가 없는 코루틴이라고 부를 수 있다.
코루틴은 IEumerator를 반환
한다.


함수란 일련의 절차에 이름을 붙인 것이다.
코루틴이란 실행을 중단-재개할 수 있는 함수이다.

왼쪽과 오른쪽은 같은 역할을 수행한다. 단, 오른쪽이 더 가독성이 좋다.

왼쪽은 isCheck에서 조건이 참인지를 확인하는 연산이 계속 이뤄지고 있다. 불필요한 연산이 연속적으로 이뤄지고 있다.

오른쪽 코루틴은 쓸데없는 연산 없이 사용이 가능하다.
하지만 오른쪽 코루틴은 최적화가 필요하다.

오른쪽 코르틴처럼 설계하면 IEnumerator 객체와 WaitForSeconds 객체가 계속 생성되기 때문에 메모리 낭비가 있다.

  • 아래 처럼 코루틴을 최적화를 해줘야 쓸데없는 메모리 낭비를 줄이고 있을 수 있다.

foreach 문을 구현하기 위해선 IEnumerable을 사용해야한다.

  • foreach문 구현 해보기

함수는 자기 코드가 다 실행될 때 까지 함수밖을 나가지 않는다.
하지만 yield문을 만나면 함수는 중간에 중단되고 자기 자리로 돌아간다.
그리고 다시 같은 함수를 만난다면 중간에 중단된 지점에서부터 다시 시작한다. 그러다 또 yield문을 만나면 중단하고, 자기 자리로 돌아간다.

  • Unity에서 코루틴은 아래와 같은 코드로 진행된다.

C#에서 사용한 코루틴이다. 직접 중단점 찍고 실행흐름을 확인하자.

코루틴은 Update 다음에 실현되는 것을 알 수 있다.

Start()를 코루틴으로 만들 수 있다.

  • Start문만 가능하다.


프로젝트하면서 코루틴 더 알게된 내용

PlayerController 클래스는 부모 클래스고, BraveCookie는 자식 클래스이다.

코루틴 최적화를 위해 부모 클래스에서 Start구문에 코루틴 타입 변수에 코루틴 함수를 저장했고, 자식 클래스에서 Start 구문에 코루틴을 실행했다.
그리고 Unity로 가서 게임을 실행하니, 코루틴이 없다는 에러가 발생했다.

원인은 부모와 자식 클래스에서 Start 구문에 코루틴 최적화를 위해 저장한 코루틴 변수와 코루틴을 실행시키기 위한 StartCoroutine이 존재하기 때문에 로직이 꼬인 것이다. 그래서 부모 클래스를 Start -> Awake함수로 바꿨더니 해결됐다.

해결 된 이유는 자식 클래스에 있는 Start 이벤트 함수가 실행되고, 부모 클래스에 있는 Start 이벤트 함수가 실행되지 않기 때문이다.

코루틴 로직

코루틴 최적화를 위해 코루틴 변수를 만들고, Awake 이벤트 함수에서 코루틴 함수에 값을 코루틴 변수에 저장했다.

하지만 코루틴은 한 번만 작동되고, 그 다음엔 작동하지 않았다.
원인은 코루틴 함수 내부에 있었다.
코루틴은 중간중간 멈추면서 실행이 된다. 그렇기 때문에 만약 코루틴을 다시 위에 있는 구문부터 실행하게 만들고 싶다면, 다시 위로 올라갈 수 있도록 로직을 만들어야하는데, 난 그렇게 만들지 않아 오류가 발생했다.

아래 사진은 예시다.

해결 방안

  1. 코루틴 함수 내부에 while문을 만든다.
    코루틴 함수가 다시 처음부터 실행할 수 있도록 만들어주는 것이다.

  2. while(true)로 만든다면 무한 루프이기 때문에 StopCoroutine을 만들어서 특정 지점에 종료를 시켜주고, 다시 처음 구문을 실행 할 수 있도록 만든다.

    • StopCoroutine은 다음 프레임에서 코루틴이 종료되기 때문에, 코루틴이 종료되는 지점을 생각하고 다시 코루틴을 재활용 할 수 있도록 로직을 만든다.
  3. 아래 사진은 예시다.

면접 질문 중 자주 묻는 것이 코루틴과 스레드의 차이점이다.


코루틴은 동시성의 역할이다.
첨부자료

동기

  • 함수가 자신의 코드를 다 수행할 때 까지는 다음 코드를 진행하지 않는다.

  • 즉, 반환 시점과 완료 시점이 같다.

    • 작업의 완료 시점과 함수 호출이 끝난 시점이 같은 것
    • 우리가 흔히 함수를 호출하는 방식을 생각하면 된다.
  • 코루틴은 동기적으로 작업이 실행된다.

비동기

  • 함수가 끝났는지 끝나지 않았는지 모른다.

  • 함수의 시점이 동일하지 않다. 즉, 반환 시점과 완료 시점이 다르다.

  • 멀티 스레드는 비동기식으로 진행된다. 비동기는 병렬적으로 진행된다.

UniTask

UniTask 수업

동기는 스레드가 동일한 작업을 하지만, 비동기는 스레드가 서로 다른 작업을 진행한다.
C#에서 비동기 문법은 아래와 같다. 비동기 문법은 간단하고, 직관적이다.

하지만 유니티는 비동기를 지원하지 않는다. 그래서 코루틴으로 다 해결하도록 만들었는데, 코루틴에 단점은 가비지 생성이고, 그만큼 메모리를 많이 낭비했다.

그래서! 등장한 개념이 바로 UniTask이다.

코루틴 동작 방법을 UniTask 방법으로 사용할 수 있다.
그러니 UniTask에 들어가서 API를 확인해보고 나한테 필요한 것들을 사용하면 된다.
async, await 개념만 알면 아주 손쉽게 사용할 수 있다.

UniTask 적용하는 방법

UniTask에서 Install할 파일을 선택한다.

해당 주소를 복사하고, Add해주면~~~

설치 끝!!

사용법(간단하게만)

profile
고급 개발자가 되고 싶어요!

0개의 댓글