Unity특성상 Target Platform의 수가 많은만큼, Program의 성능이 높아져야하기때문에 Coroutine은 사실상 필수입니다.
코드의 가독성은 덤입니다.
Coroutine을 사용한 구현과 사용하지 않은 구현을 비교해보겠습니다.
// Coroutine 사용 IEnumerator Function(string a, string b, string c) { yield return new WaitForSecond(2f); // 2초 대기 Debug.Log(a); yield return new WaitForSecond(2f); Debug.Log(b); yield return new WaitForSecond(2f); Debug.Log(c); } void Start() { StartCoroutine(Function("FirstAction","SecondAction","ThirdAction")); }
// Coroutine 사용하지않음 string a; string b; string c; bool isAFinished; bool isBFinished; bool isCFinished; float runningTime; void Start() { a = "FirstAction"; b = "SecondAction"; c = "ThirdAction"; isAFinished = false; isBFinished = false; isCFinished = false; runningTime = 0f; } void Update() { runningTime = runningTime + Time.deltaTime; if( runningTime > 2f && isAFinished == false) { Debug.Log(a); isAFinished = true; } if( runningTime > 2f+2f && isBFinished == false) { Debug.Log(b); isBFinished = true; } if( runningTime > 2f+2f+2f && isCFinished == false) { Debug.Log(c); isCFinished = true; } }
같은 기능을 하는 코드입니다.
가장 먼저 느껴지는 차이점은 가독성입니다.
그 다음은 성능인데, Coroutine의 경우 심플합니다.
하지만 Coroutine을 사용하지 않은 경우는 세 문자열을 다 출력하는데 1080번의 if문을 실행합니다.
거기다 정상적으로 작동하고나서도 초당 180번의 if문을 실행하게됩니다.
코드를 더 줄일수있긴 합니다.
Start()를 선언할때 IEnumerator를 붙여주면 유니티에서 Coroutine으로 호출해줍니다.
IEnumerator Start() { yield return new WaitForSecond(2f); Debug.Log("FirstAction"); yield return new WaitForSecond(2f); Debug.Log("SecondAction"); }
Coroutine에서는 yield 키워드를 사용해서 기능을 사용하게 되는데, yield 관련 키워드는 다음과 같습니다.
yield return null
다음 Update까지 대기
yield return new WaitForSeconds(float)
지정된 시간만큼 대기
yield return new WaitForFixedUpdate()
다음 FixedUpdate까지 대기
yield return new WaitForEndOfFrame()
렌더링이 끝날 때까지 대기
yield return StartCoroutine(function)
StartCoroutine안에 넣은 코루틴이 끝날 때까지 대기
yield return WWW
WWW 작업이 끝날 때까지 대기
오 유용해요
답글삭제크 좋은정보 감사합니다
답글삭제