[유니티 C#] 코루틴

YongSeok·2022년 10월 10일
0

✏️ 코루틴 사용법

👇 코루틴 사용법 - 1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(LoopA());
    }
    
    IEnumerator LoopA()
    {
        for (int i = 0; i < 10; i++)
        {
            Debug.Log("LoopA 코루틴 실행");
            yield return new WaitForSeconds(1f);
        }
    }
}

👇 코루틴 없이 딜레이 구현

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    public bool isDelay;
    public float delayTime = 2f;
    public float timer = 0f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (!isDelay)
            {
                isDelay = true;

                Debug.Log("공격!");
            }
            else
            {
                Debug.Log("딜레이중..");
            }
        }
        if (isDelay)
        {
            timer += Time.deltaTime;
            if (timer >= delayTime)
            {
                timer = 0;
                isDelay = false;
            }
        }
    }
}

👇 코루틴 사용법 - 2

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    public bool isDelay = false;
    public float delayTime = 2f;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            if (!isDelay)
            {
                isDelay = true;

                Debug.Log("공격!");
                StartCoroutine(CountAttackDelay());
            }
            else
            {
                Debug.Log("딜레이중..");
            }
        }
    }

    IEnumerator CountAttackDelay()
    {
        yield return new WaitForSeconds(delayTime);
        isDelay = false;
    }
}

👇 코루틴 사용법 - 매개변수

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(TestCoroutine(10));
    }

    IEnumerator TestCoroutine(int count)
    {
        int i = 0;
        while (i < count)
        {
            yield return null;
            Debug.Log("코루틴 " + i);
            i++;
        }
    }
}

🚨 코루틴 주의사항

  • 코루틴을 Start함수가 호출된 이후에 그리고 게임오브젝트가 활성화된 상태에서 호출해야만 한다. Awake함수에서 호출하거나 게임오브젝트가 비활성화시 코루틴이 정상 작동하지 않는다
  • 서브 Update함수처럼 사용하기 위해서 코루틴 루프내에서 무한루프를 돌릴때 코루틴 내부의 반복문 안에 yield return 코드를 작성해서 적절하게 제어권을 양보해줘야 한다.

✏️ 코루틴 중단

[StopCoroutine]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    IEnumerator enumerator;
	void Start()
    {
        enumerator = TestCoroutine();
        StartCoroutine(enumerator);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StopCoroutine(enumerator);
        }
    }

    IEnumerator TestCoroutine()
    {
        int i = 0;
        while (true)
        {
            yield return null;
            Debug.Log("코루틴 " + i);
            i++;
        }
    }
}

[StopAllCoroutine]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    IEnumerator enumerator;
    
	void Start()
    {
        enumerator = TestCoroutine();
        StartCoroutine(enumerator);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StopAllCoroutines();
        }
    }

    IEnumerator TestCoroutine()
    {
        int i = 0;
        while (true)
        {
            yield return null;
            Debug.Log("코루틴 " + i);
            i++;
        }
    }
}

[yield break]

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(ReturnCoroutine());
        StartCoroutine(BreakCoroutine());
    }

    IEnumerator ReturnCoroutine()
    {
        Debug.Log("Return 1");
        yield return null;
        Debug.Log("Return 2");
    }

    IEnumerator BreakCoroutine()
    {
        Debug.Log("Break 1");
        yield break;			// 이때 코루틴 함수가 완전히 멈춘다
        Debug.Log("Break 2");	// 실행시 Break 2 는 콘솔 화면에 보이지 않는다
    }
}

0개의 댓글