[Memo-Unity] 7. ์ฝ”๋ฃจํ‹ด (Coroutine)

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: ,




์ฝ”๋ฃจํ‹ด (Coroutine)








1. ์ฝ”๋ฃจํ‹ด (Coroutine)

์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—…์„ ๋‹ค์ˆ˜์˜ ํ”„๋ ˆ์ž„์— ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Unity์—์„œ ์ฝ”๋ฃจํ‹ด์€ ์‹คํ–‰์„ ์ผ์‹œ ์ •์ง€ํ•˜๊ณ  ์ œ์–ด๋ฅผ Unity์— ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์ค‘๋‹จํ•œ ๋ถ€๋ถ„์—์„œ ๋‹ค์Œ ํ”„๋ ˆ์ž„์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‹คํ–‰์„ ์™„๋ฃŒํ•œ ๋’ค ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์— ์ œ์–ด์™€ ์„ ํƒ์  ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ํ–‰๋™์€ ๋‹จ์ผ ํ”„๋ ˆ์ž„ ์—…๋ฐ์ดํŠธ ๋‚ด์—์„œ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ฅธ ์ด๋ฒคํŠธ์˜ ์‹œํ€€์Šค๋‚˜ ์ ˆ์ฐจ์ƒ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

void Update()
{
    if (Input.GetKeyDown("f"))
    {
        StartCoroutine(DoCheck());
    }
}

IEnumerator DoCheck()
{
    for(;;)
    {
        //์‹คํ–‰์ฝ”๋“œ
        yield return new WaitForSeconds(.1f);
    }
}
  • StartCoroutine(DoCheck()); ๋กœ ์ฝ”๋ฃจํ‹ดํ•จ์ˆ˜ ์‚ฌ์šฉ
  • IEnumerator DoCheck() ~~~
  • WaitForSeconds(xf); x์ดˆ๊ฐ„ WaitForSeconds








2. ์ฝ”๋ฃจํ‹ด ์ •์ง€

StopCoroutine๊ณผ StopAllCoroutines์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด์„ ์ •์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋ฃจํ‹ด์— ์—ฐ๊ฒฐ๋œ ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด SetActive๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ์ฝ”๋ฃจํ‹ด์ด ์ •์ง€๋ฉ๋‹ˆ๋‹ค.
Destroy(example) (์—ฌ๊ธฐ์„œ example์€ MonoBehaviour์˜ ์ธ์Šคํ„ด์Šค)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด OnDisable์„ ์ฆ‰์‹œ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉฐ Unity๋Š” ์ฝ”๋ฃจํ‹ด์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ์ •์ง€์‹œํ‚ต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ OnDestroy๋Š” ํ”„๋ ˆ์ž„ ๋์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.








3. 12/18 ์ถ”๊ฐ€

์ฝ”๋ฃจํ‹ด์€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ , ์ดํ›„์— ๋‹ค์‹œ ์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ) ๋ฌด์ ์ƒํƒœ 5์ดˆ

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{
    bool invincible = false;

    void Start()
    {
        StartCoroutine(InvincibilityCoroutine());
    }

    IEnumerator InvincibilityCoroutine()
    {
        invincible = true;
        yield return new WaitForSeconds(5f);
        invincible = false;
    }
}








4. Yeild ์ข…๋ฅ˜

  • yield return null : ๋‹ค์Œ ํ”„๋ ˆ์ž„๊นŒ์ง€ ๋Œ€๊ธฐ
  • yield return new WaitForSeconds(float) : ์ž…๋ ฅํ•œ ์ดˆ(sec) ๋งŒํผ ๋Œ€๊ธฐ
  • yield return new WaitForSecondsRealtime(float) : Timescale์˜ํ–ฅ์—†๋Š” ์‹ค์ œ ์‹œ๊ฐ„ ๊ธฐ์ค€ ์ดˆ ๋Œ€๊ธฐ
  • yield return new WaitFixedUpdate() : ๋‹ค์Œ ํ”„๋ ˆ์ž„์˜ FixedUpdate ๊นŒ์ง€ ๋Œ€๊ธฐ
  • yield return new WaitForEndOfFrame() : ๋ชจ๋“  ๋žœ๋”๋ง ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • yield return startCoroutiune(string) : ์ž…๋ ฅํ•œ ๋‹ค๋ฅธ ์ฝ”๋ฃจํ‹ด์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • yield return new www(string) : ์ž…๋ ฅํ•œ ์›น ํ†ต์‹  ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • yield break : ์ฝ”๋ฃจํ‹ด ์ข…๋ฃŒ

์ฝ”๋ฃจํ‹ด์€ StopCoroutine๊ณผ StopAllCoroutines๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด์„ ์ •์ง€๊ฐ€๋Šฅํ•˜๋ฉฐ
์ฝ”๋ฃจํ‹ด์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์ง€ํ•˜๊ฑฐ๋‚˜ ํŒŒ๊ดดํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ์ปดํฌ๋„ŒํŠธ๋ฅผ .enabled๋ฅผ false๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๊บผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.








5. Enumerator

  • Enumerator๋Š” IEnumerator ๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • IEnumerator ์ธํ„ฐํŽ˜์ด์Šค๋Š” Current (์†์„ฑ), MoveNext() (๋ฉ”์„œ๋“œ), Reset() (๋ฉ”์„œ๋“œ) ๋“ฑ 3๊ฐœ์˜ ๋ฉค๋ฒ„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ,
    Enumerator๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Current์™€ MoveNext() ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด ์œ ๋‹ˆํ‹ฐ์˜ DelayedCallManager๊ฐ€ ๋“ฑ๋กํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ๋‹ค์Œ ๋‹จ๊ณ„์— ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.








24.01.01 ์ถ”๊ฐ€

  • ๋‹ค์ˆ˜์˜ ํ”„๋ ˆ์ž„์— ๋ถ„์‚ฐ์‹œ์ผœ์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•
  • ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋Š” 1ํ”„๋ ˆ์ž„์— ์‹คํ–‰
  • ์ฝ”๋ฃจํ‹ด์€ ๋™์‹œ์ ์ด๋‹ค, ๋น„๋™๊ธฐ X
Coroutine coroutine = null

void Update()
{
    coroutine = StartCoroutine(CoFade())

    if(input.GetKeyDown("t"))
    {
        if(coroutine !=null) StopCoroutine(coroutine)
    }
}

  • StopCoroutine(ํ•จ์ˆ˜๋ช…()) ์€ ์›ํ•˜๋Š” ๋•Œ์— ๋ฉˆ์ถ”์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • StopCoroutine(โ€œํ•จ์ˆ˜๋ช…โ€), stopAllCoroutine
  • StopCoroutine(โ€œํ•จ์ˆ˜๋ช…โ€)์€ ์ถ”์ ์ด์•ˆ๋œ๋‹ค.
  • ์œ„ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.
  • Waitforsecont ๋ณด๋‹ค ๊ฒŒ์ž„์˜ ํ”„๋ ˆ์ž„์„ ๋งž์ถ”๊ณ  waitforendofframe์„ ์“ฐ๋ฉด ๋ชจ๋“ ์ปดํ“จํ„ฐ์˜ ๊ธฐ์ค€์„ ๋˜‘๊ฐ™์ด ๊ฐ€๋Šฅ.
  • yield return WWW ์„œ๋ฒ„๊ด€๋ จ








[C#] ์ฝ”๋ฃจํ‹ด (Coroutine) ์ฐธ์กฐ
TOP


๐Ÿ“”

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ