본문 바로가기

Programming/Unity - Reference

[Unity C# Reference] CoRoutine


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");
    }
}
 

cs


'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