๋ฐ˜์‘ํ˜•

๐Ÿ“Œ Coroutine์ด๋ž€?

**์ฝ”๋ฃจํ‹ด(Coroutine)**์€ Unity์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜๋กœ, ์ž‘์—…์˜ ํ๋ฆ„์„ ์ค‘๊ฐ„์— ์ผ์‹œ์ •์ง€ํ•˜๊ณ , ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋‹ค์‹œ ์ด์–ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋ฃจํ‹ด์€ IEnumerator ๋ฐ˜ํ™˜ํ˜•์„ ๊ฐ€์ง€๋ฉฐ, StartCoroutine() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋œ๋‹ค.

IEnumerator ExampleCoroutine()
{
    Debug.Log("1์ดˆ ๋Œ€๊ธฐ ์ „");
    yield return new WaitForSeconds(1f);
    Debug.Log("1์ดˆ ๋Œ€๊ธฐ ํ›„");
}
StartCoroutine(ExampleCoroutine());

โš™๏ธ Coroutine ์‹คํ–‰ ํ๋ฆ„

์ฝ”๋ฃจํ‹ด์€ Update() ํ•จ์ˆ˜๊ฐ€ ๋๋‚œ ๋’ค ์‹คํ–‰๋œ๋‹ค.
์ฆ‰, ๋ชจ๋“  Update() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ดํ›„, ์ฝ”๋ฃจํ‹ด์ด yield returnํ•œ ์ง€์ ๋ถ€ํ„ฐ ์žฌ๊ฐœ๋œ๋‹ค.


โฑ๏ธ ๋‹ค์–‘ํ•œ YieldInstruction ์ข…๋ฅ˜

YieldInstruction ์„ค๋ช…
yield return null ๋‹ค์Œ ํ”„๋ ˆ์ž„๊นŒ์ง€ ๋Œ€๊ธฐ ํ›„ ์ด์–ด์„œ ์‹คํ–‰
yield return new WaitForSeconds(x) x์ดˆ ํ›„์— ์ด์–ด์„œ ์‹คํ–‰
yield return new WaitForFixedUpdate() ๋ชจ๋“  FixedUpdate() ์ดํ›„์— ์‹คํ–‰๋จ
yield return new WaitUntil(() => condition) ์ฃผ์–ด์ง„ ์กฐ๊ฑด์ด true๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
yield return new WaitWhile(() => condition) ์ฃผ์–ด์ง„ ์กฐ๊ฑด์ด false๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
yield return www WWW ์š”์ฒญ(์›น ์š”์ฒญ)์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ (UnityWebRequest ๊ถŒ์žฅ)
yield return StartCoroutine(Other()) ๋‹ค๋ฅธ ์ฝ”๋ฃจํ‹ด์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
 

๐Ÿ” Coroutine ์ค‘๋‹จ ๋ฐ ์ข…๋ฃŒ

  • ์ค‘๋‹จ: StopCoroutine("ํ•จ์ˆ˜์ด๋ฆ„"), StopCoroutine(์ฝ”๋ฃจํ‹ด๋ณ€์ˆ˜)
  • ๋ชจ๋“  ์ฝ”๋ฃจํ‹ด ์ข…๋ฃŒ: StopAllCoroutines()
Coroutine myRoutine;

void Start()
{
    myRoutine = StartCoroutine(MyCo());
}

void StopIt()
{
    StopCoroutine(myRoutine);
}

 

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ• ์ ์€ ์ฝ”๋ฃจํ‹ด์„ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด StopCoroutine์„ํ•ด๋„ ๋ฉˆ์ถ”์ง€ ์•Š๋Š”๋‹ค ์™œ๋ƒํ•˜๋ฉด ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!!


โœ… ์–ธ์ œ Coroutine์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์‚ฌ์šฉ ์‚ฌ๋ก€์„ค๋ช…
์—ฐ์ถœ ์ฒ˜๋ฆฌ ํ™”๋ฉด ์ „ํ™˜, ํšจ๊ณผ ํƒ€์ด๋ฐ, ๋Œ€๊ธฐ ํ›„ ์‹คํ–‰ ๋“ฑ
์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ฐ˜๋ณต ์ผ์ • ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋™์ž‘ ๋ฐ˜๋ณต (์˜ˆ: ์ด์•Œ ๋ฐœ์‚ฌ ์ฟจํƒ€์ž„)
์กฐ๊ฑด ๋Œ€๊ธฐ ์–ด๋–ค ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ฒ˜๋ฆฌ
๋น„๋™๊ธฐ ์ž‘์—… ์›น ์š”์ฒญ, ํŒŒ์ผ ๋กœ๋”ฉ ๋“ฑ ์™„๋ฃŒ๊นŒ์ง€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…
 

๐Ÿง  ์ฃผ์˜ํ•  ์ 

  • yield return new WaitForSeconds()๋Š” Time.timeScale์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค. (0์ด๋ฉด ๋ฉˆ์ถค)
  • MonoBehaviour๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๋ฉด ์ฝ”๋ฃจํ‹ด๋„ ๋ฉˆ์ถ˜๋‹ค.
  • ์ฝ”๋ฃจํ‹ด ๋‚ด์—์„œ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค๋ฉด ๊ฒŒ์ž„์ด ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงช ์˜ˆ์‹œ: ๊ฐ„๋‹จํ•œ ๋ฐ˜๋ณต ๊ณต๊ฒฉ

IEnumerator AutoAttack()
{
    while (true)
    {
        Attack();
        yield return new WaitForSeconds(1f); // 1์ดˆ๋งˆ๋‹ค ๊ณต๊ฒฉ
    }
}

๐Ÿ ๋งˆ๋ฌด๋ฆฌ

์ฝ”๋ฃจํ‹ด์€ Unity ๊ฐœ๋ฐœ์—์„œ ์‹œ๊ฐ„์„ ๋‹ค๋ฃจ๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
์ฒ˜์Œ์—” Update()๋ณด๋‹ค ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ต์ˆ™ํ•ด์ง€๋ฉด ํƒ€์ด๋ฐ ์ œ์–ด, ์—ฐ์ถœ ๊ตฌํ˜„, ๋Œ€๊ธฐ ์ฒ˜๋ฆฌ์— ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.

 

 

ํ ..์›๋ž˜ ๊ฐœ๋ฐœํ• ๋•Œ ์ฝ”๋ฃจํ‹ด์„ ๋งŽ์ด ์ผ์—ˆ๋Š”๋ฐ ์ธ๋ณดํฌ๋„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋“ฏ ํ•˜๋‹ค ์ธ๋ณดํฌ์™€ ์ฝ”๋ฃจํ‹ด ๋น„๊ตํ•˜๋Š” ๊ธ€๋„ ํ•œ๋ฒˆ ์ž‘์„ฑํ•ด ๋ด์•ผ๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•