[Unity] Coroutine
단일스레드인 유니티에서 멀티스레드를 사용하는 것 처럼 만들때 사용하는 게 코루틴이다.
화면상에는 로딩프로그래스바를 돌리면서 코루틴을 사용해서 게임데이터를 로딩하거나
웹서버로부터 데이터를 받아오거나
간단하게는 일정시간을 카운트 하는 등 유용하게 써먹을 수있다.
(Update에서 time.deltaTime 값을 누적해서 시간을 카운트하는 방법보다 부하가 훨신 적다)
사용 방법은 아래와 같다.
코루틴 정의는 아래와 같다
인자 값은 생략할 수 있으며 인자는 call by value로만 받을 수 있다
코루틴은 일반 메서드와같이 호출되면 제어가 이동해서 메서드내의 문장을 실행하고
제어가 복귀되는 선형적인 서브루틴과 달리
코루틴 내의 문장을 실행하다가 yield를 만나면 제어가 복귀했다가
이후에 yield이후의 문장을 수행한다.
yield이후 문장의 실행 시점은 다음과 같이 지정해줄 수있다.
StartCoroutine(IEnumerator routine)으로 코루틴을 실행했다면
StopCoroutine(IEnumerator routine)로 코루틴을 멈춰주고
StartCoroutine(string methodName, object value = null)으로 코루틴을 실행했다면
StopCoroutine(string methodName)으로 코루틴을 멈춰주도록 한다.
그래도 안 된다면(실재로 이 경우가 개인적으로 진행하는 프로젝트에서 발생 | Unity Ver5.1.2)
Coroutine 변수를 하나 만들어서 StartCoroutine() 호출시 반환 값을 Coroutine변수에 담고
코루틴을 멈출 때 StopCoroutine()의 인자 값으로 이 변수를 넣어주면 해당 코루틴을 멈출 수 있다.
화면상에는 로딩프로그래스바를 돌리면서 코루틴을 사용해서 게임데이터를 로딩하거나
웹서버로부터 데이터를 받아오거나
간단하게는 일정시간을 카운트 하는 등 유용하게 써먹을 수있다.
(Update에서 time.deltaTime 값을 누적해서 시간을 카운트하는 방법보다 부하가 훨신 적다)
사용 방법은 아래와 같다.
// 코루틴 시작 public Coroutine StartCoroutine(IEnumerator routine); public Coroutine StartCoroutine(string methodName, object value = null); // 코루틴을 임의로 정지할 때 사용 public void StopCoroutine(string methodName); public void StopCoroutine(IEnumerator routine);
코루틴 정의는 아래와 같다
인자 값은 생략할 수 있으며 인자는 call by value로만 받을 수 있다
IEnumerator CoroutineName(object value)
{
/*
실행문장...
*/
// 사용자 필요에따라 yield를 지정해줄 수 있다.
yield return null;
// 다시 돌아와서 실행할 문장
}
코루틴은 일반 메서드와같이 호출되면 제어가 이동해서 메서드내의 문장을 실행하고
제어가 복귀되는 선형적인 서브루틴과 달리
코루틴 내의 문장을 실행하다가 yield를 만나면 제어가 복귀했다가
이후에 yield이후의 문장을 수행한다.
yield이후 문장의 실행 시점은 다음과 같이 지정해줄 수있다.
- null - Update구문의 수행이 완료될 때까지 대기 (가변프레임 이후)
- WaitForEndOfFrame - 현재 프레임의 렌더링 작업이 끝날 때까지 대기
- WaitForFixedUpdate - FixedUpdate구문의 수행이 완료될 때까지 대기(물리프레임 이후)
- WaitForSeconds - 지정한 시간동안 대기
- WWW - 웹에서 데이터 송수신완료 시까지 대기
코루틴을 정지하려고 StopCoroutine()을 사용할 때 이게 생각처럼 작동하지 않는 경우가 있는데
StartCoroutine(IEnumerator routine)으로 코루틴을 실행했다면
StopCoroutine(IEnumerator routine)로 코루틴을 멈춰주고
StartCoroutine(string methodName, object value = null)으로 코루틴을 실행했다면
StopCoroutine(string methodName)으로 코루틴을 멈춰주도록 한다.
그래도 안 된다면(실재로 이 경우가 개인적으로 진행하는 프로젝트에서 발생 | Unity Ver5.1.2)
Coroutine 변수를 하나 만들어서 StartCoroutine() 호출시 반환 값을 Coroutine변수에 담고
코루틴을 멈출 때 StopCoroutine()의 인자 값으로 이 변수를 넣어주면 해당 코루틴을 멈출 수 있다.
public class TEST : MonoBehavaior
{
// 코루틴 선언후 null초기화===========
Coroutine _coroutine = null;
void Start()
{
// 코루틴을 수행하면서 리턴 값을 담아둔다
_coroutine = StartCoroutine(TestCoroutine());
}
// 코루틴 정의========================
IEnumerator TestCoroutine()
{
// 실행문장...
yield return new WaitForSecond(10f);
// 10초 뒤에 실행할 문장...
}
// 충돌발생시 코루틴 정지=============
void OnCollisionEnter(collision info)
{
// 인자 값으로 StartCoroutine()의 리턴값으로 저장해둔 값을 넣어둔다.
StopCoroutine(_coroutine);
}
}
댓글
댓글 쓰기