TIL

2024 11 23 TIL

noc777 2024. 11. 23. 22:56

이번 주말엔 밀렸던 피로가 한번에 몰려온건지 하루종일 잠을 잤던 것 같다.  

일어나서 저번 팀 프로젝트 때 코루틴으로 처리하였다면 좋았을 상황이 많았던 것 같아

코루틴에 대해서 강의를 다시 정독해보고 정리해본다. 

 

코루틴 Coroutine

 

코루틴은 하나의 작업을 여러 개의 프레임에 분산하고 싶을 때 쓰이는 개념이다.

 

코루틴이 쓰이는 용도

 

1. 수초간 지속적으로 진행되어야할 때 

유니티의 프레임에서 처리하는 방식으로 작업한다면

for문에 돌려놓고 중간에 진행을 멈추고 다시 되돌아오는 표현을 하기가 힘들다.

(즉 진행시키는 것을 중간 중간 유예시키고 싶을 때 쓰인다.)

 

2.조건을 걸어주고 싶을 때

만약 상대가 이번까지만 상대편이고 아군으로 들어온다거나 현실적인 초 개념이 지났을 때

아군으로 전환되는 연출이 필요할 때 라던가

(즉 특정한 조건을 걸어주고 조건이 끝나면 실행되도록 할 때 코루틴이 쓰인다.)

 

3.웹 요청

서버에 요청을 하면 서버에서 처리하는 시간동안 만큼의 유예시간이 필요하다.

이 때 유니티의 프레임에서 처리하면 서버에서 정보를 내려주기 전에 다음 작업이 시작되기에

요청한 정보가 없어 Null Reference가 뜰 수 있다.

 

코루틴을 사용하는 방법

 

Unity에서 코루틴을 사용할 때 IEnumerator 라는 타입을 사용한다. 

IEnumerator 에 F12 를 눌러 정보를 확인해보면 아래 처럼 코루틴의 구조를 볼 수가 있다.

namespace System.Collections
{
    public interface IEnumerator
    {
        object Current { get; }

        bool MoveNext();
        void Reset();
    }
}

내가 이해한 바를 정리해보면

 

- object Current는 yield return을 사용한 지점까지를 저장한다

 

- bool 값인 MoveNext는 이후 처리할 작업이 있는 지 확인한다. (있다면 true 없으면 false를 반환)

 

- void Reset은 모든 처리가 마쳤을 때 현재 쓰이고 있는 IEnumrator를 초기 상태로 초기화한다.

 

코루틴은 이런 원리로 돌아간다.

yield return으로 유예되는 동안 진행한 시점까지를 저장하고

다음 처리 작업이 있다면 유예된 시간이 종료되었을 때 다시 처리가 시작되는 것이 일단 코루틴의 원리다.

 

코루틴 함수
//코루틴을 실행할 때
StartCoroutine("IEnumerator 함수 이름");
StartCoroutine(IEnumerator함수);

//코루틴을 임의로 종료할 때
 StopCoroutine("IEnumerator 함수 이름");
 StopCoroutine(IEnumerator함수);

유니티에서 코루틴을 사용할 땐 코루틴 함수를 사용한다. (MonoBehaviour를 상속받은 클래스에서만 함수실행 가능)

 

StartCoroutine 함수를 통해 코루틴 실행이 가능하고 

StopCoroutine 함수로 코루틴 중지가 가능하다 
(Stop코루틴을 사용하지 않을 경우 같은 코루틴이 반복해서 실행되어 호출이 중첩될 수 있다)

 

yield return

 

yield return은 코루틴을 쓸 때 처리를 지연하고 싶은 시점에 쓰인다.  

//yield return 의 종류

yield return null; 
//다음 프레임까지 대기 
//Update()의 프레임이 끝났을 때 다음 구문이 실행된다.

yield return new WaitForSeconds();
//new WaitForSeconds()의 인자()만큼 초를 대기한다. 


yield return new WaitForSecondsRealtime();
//WaitForSeconds 와 다른 점은 절대적인 실제 시간을 기준으로 처리된다는 것

yield return new WaitForEndOfFrame();
//한 프레임워크가 완전히 종료되었을 때 다음 구문이 실행된다.

yield return new WaitForFixedUpdate();
//FixedUpdate() 메서드의 처리가 끝났을 때 다음 구문이 실행된다.

yield return new WaitUntil();
//()안의 조건이 True일 때 다음 구문이 실행된다.

yield return new WaitWhile();
//()안의 조건이 False일 때 다음 구문이 실행된다.

yield return StartCoroutine(); 처럼 끝나는 시점에 다른 코루틴을 실행시키거나 종료도 가능


//new 키워드를 사용할 때마다 객체를 생성하므로 GC의 처리할 양이 많아지기에 미리 캐싱해놓고 참조할 수 있다.
//WaitForSeconds waitForSeconds 처럼 캐싱이 가능하다.

 

 

코루틴을 사용할 때 주의점

코루틴은 연결되어 있는 오브젝트가 종료되면 코루틴도 종료가 됩니다.

while true 처럼 무한루프를 사용하는 경우 안에  yield return을 넣어주어야합니다.

 

'TIL' 카테고리의 다른 글

2024 11 25 TIL  (1) 2024.11.25
2024 11 24 TIL  (0) 2024.11.24
2024 11 22 TIL  (0) 2024.11.22
2024 11 21 TIL  (1) 2024.11.21
2024 11 20 TIL  (0) 2024.11.20