이번 주말엔 밀렸던 피로가 한번에 몰려온건지 하루종일 잠을 잤던 것 같다.
일어나서 저번 팀 프로젝트 때 코루틴으로 처리하였다면 좋았을 상황이 많았던 것 같아
코루틴에 대해서 강의를 다시 정독해보고 정리해본다.
코루틴 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 |