반응형

보통 함수는 하나의 프레임내에서 명령이 실행되게 하는데, 여러 프레임에 걸쳐서 코드를 실행시키기 위한 함수가 코루틴(Coroutine)입니다.
쓰레드와 비슷하다고 느낄 수 있지만 비동기가 아니기 때문에 쓰레드는 아닙니다.
대체로 Update함수를 이용해서 구현할 수 있지만, 코루틴을 사용해야하는 이유는 작업을 나눠서 수행할 수 있고, 불필요한 작업들이
Update문에서 계속 실행되는 것을 방지할 수 있습니다.


형식
함수를 정의한 후 StartCoroutine(코루틴함수)로 실행을 합니다.
코루틴 함수는 IEnumerator의 반환형을 가집니다.

예제

 

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
33
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Test : MonoBehaviour
{
    GameObject goSprite;
    SpriteRenderer spriteRenderer;
    float m_fAlpha = 0f;
    void Start()
    {
        goSprite = GameObject.Find("Sprite");
        spriteRenderer = goSprite.GetComponent<SpriteRenderer>();
        spriteRenderer.color = new Color(0000);
        StartCoroutine ("Fade");
    }
 
    void Update()
    {
        
    }
    IEnumerator Fade()
    {
        
        for(int i = 0; i < 10; i++)
        {
            m_fAlpha += 0.1f;
            spriteRenderer.color = new Color(000, m_fAlpha );
            yield return new WaitForSeconds(1f);
        }
        
    }
}
 

Sprite Object의 알파수치를 변경하는 예제입니다.
IEnumerator Fade() 함수를 생성해주고, StartCoroutine을 통해 시작하도록 했습니다.
yield return new WaitForSeconds(1f); 이 코드는 1초를 대기하라는 의미입니다.

yield 키워드의 종류는 다음과 같습니다.
yield return null
yield return new WaitForSeconds(float second)  - 주어진 시간(초)동안, co-routine의 수행을 중단합니다.
yield return new WaitForFixedUpdate() - 다음 고정 프레임 업데이트 함수(fixed frame rate update)가 호출될 때까지 기다립니다.
yield return new WaitForEndOfFrame() - 화면에 컨텐츠를 보여주는 프레임 바로 직전에, 모든 카메라와 GUI가 렌더링을 완료하는 프레임의 마지막을 기다립니다.
yield return StartCoRoutine(string) - 다른 코루틴이 끝날 때까지 기다립니다.
yield return new WWW() - 웹 통신 작업이 끝날 때까지 기다립니다.
yield return new AsyncOperation - 비동기 작업이 끝날때까지 기다립니다.

코루틴이 진행중에도 StopCoroutine(함수명)을 입력한다면 정지시킬 수 있습니다.

방금 사용한 StartCoroutine ("Fade"); 이렇게 스트링으로 함수명을 넣을 수도 있지만,
직접 함수를 StartCoroutine (Fade());로 코드를 작성할 수 있습니다.

그리고 함수에 매개변수를 넣어서 표현도 가능합니다.

StartCoroutine (Fade(0.1f));

IEnumerator Fade(float fAlphaPlus)

    for(int i = 0; i < 10; i++)
    {
        m_fAlpha += fAlphaPlus;
        spriteRenderer.color = new Color(0, 0, 0, m_fAlpha );
        yield return new WaitForSeconds(1f);
    }  
}

반응형

+ Recent posts