Co-Routine
Co-Routine은 메인 스크립트의 Flow와 병렬로 처리되는 별개의 process이다.
일반적으로 특정 process에 delay를 주고자 할때 편리하게 사용할 수 있다.
Unity에서 Co-Routine은 IEnemerator 형태를 반환하는 함수를 사용하는데 이것은 유니티 고유 문법이다 (즉 C# 공용 문법이 아니다)
그리고 Co-Routine은 최소 1회 이상의 yield return문을 사용하여야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CoRoutine_Fade : MonoBehaviour { public Image fadeImage; // Use this for initialization void Start () { StartCoroutine(FadeIn());
StartCoroutine("FadeIn"); //둘다 가능 } // Update is called once per frame void Update () { } IEnumerator FadeIn() { Color startColor = fadeImage.color; for(int i=0; i<100; i++) { startColor.a = startColor.a - 0.01f; fadeImage.color = startColor; yield return new WaitForSeconds(0.01f); } } } | cs |
StartCoroutine(IEnumerator Function())
StartCoroutine("IEnumerator Function")
둘다 해당 코루틴 함수를 실행시킴
함수명을 바로 넣든, 함수 이름만 string 형태로 넣든 둘다 실행이 가능함. 단 위쪽의 경우 처리 속도가 빠르고, 아래쪽의 경우 코루틴 작동 중에 외부에서 제어가 가능함. + String이므로 변수 등을 통하여 제어도 가능함.
yield return문 : Co-Routine의 제어구문. 하위 옵션을 통해 delay를 설정할 수 있음
yield return new WaitForSeconds(float seconds) : 지정된 시간동안 대기한 후 진행.
yield return new WaitForEndOfFrame() : 다음 프레임의 렌더링 직전까지 대기한 후 진행.
yield return new WaitForFixedUpdate() : 다음 프레임의 FixedUpdate까지 대기한 후 진행.
yield return null : 1프레임만 대기한 후 진행
StopCoRoutine("IEnumerator Function") : 진행중인 코루틴을 종료한다.
이 경우 StartCoRoutine에서 string형으로 잡아줬을때만 먹힌다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class HelloCoRoutine : MonoBehaviour { //Main // Use this for initialization void Start () { StartCoroutine("HelloUnity"); } // Update is called once per frame void Update () { if(Input.GetMouseButtonDown(0)) { StopCoroutine("HelloUnity"); } } IEnumerator HelloUnity() //CoRoutine 1 { while (true) { Debug.Log("Hello"); yield return new WaitForSeconds(3.0f); Debug.Log("Unity"); } } } | cs |
CoRoutine은 메인routine과 비동기 방식(병렬)으로 처리된다. 따라서 동시 처리가 가능하다.
따라서 아래와 같은 코드의 경우 실행해준 2개의 코루틴 함수가 동시에 작동한다. 로그창엔
[즉시]Hello (Start에서 HelloUnity실행하여 찍힌것)
[즉시]Hi (Start에서 hiCSharp실행하여 찍힌것
[즉시]End (Start에서 다음줄 Debug.Log해서 찍힌것)
[시작 3초후]Unity (1번째 코루틴에서 3초 기다린 후 찍힘)
[시작 5초후]CSharp(2번째 코루틴에서 5초 기다린 후 찍힘)
이 순서대로 찍힌다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class HelloCoRoutine : MonoBehaviour { //Main // Use this for initialization void Start () { StartCoroutine("HelloUnity"); StartCoroutine("HiCSharp"); Debug.Log("End"); } // Update is called once per frame void Update () { } IEnumerator HelloUnity() //CoRoutine 1 { Debug.Log("Hello"); yield return new WaitForSeconds(3.0f); Debug.Log("Unity"); } IEnumerator HiCSharp() //CoRoutine 2 { Debug.Log("Hi"); yield return new WaitForSeconds(5.0f); Debug.Log("C Sharp"); } } |
'Programming > Unity - Reference' 카테고리의 다른 글
[Unity C# Reference] Interface Class (0) | 2018.06.11 |
---|---|
[Unity C# Reference] Physics.Raycast (0) | 2018.06.11 |
[Unity C# Reference] Transform (0) | 2018.06.11 |
[Unity C# Reference] List (0) | 2018.06.10 |
[Unity C# Reference] Quternion (0) | 2018.06.09 |