์์ฑ์ : ๋ฐ์ฌ์ฉ
๋ณธ ์๋ฃ๋ ์์ฑ์์ธ '๋ฐ์ฌ์ฉ'์ ํ Repository์ ๊ธ๊ณผ ์ ๋ํฐ ๊ต๊ณผ์ ์ฑ ์ ์ฌ๊ตฌ์ฑํ์ฌ ์์ฑ๋์์ต๋๋ค. ๋ค์ํ ์ธ์ด(javascript, C++, Kotlin, C#)์์ ์ฝ๋ฃจํด์ ์ฌ์ฉํ์ง๋ง ์์ ๋ C#์ ๊ตญํ๋ ์ค๋ช ์ผ๋ก ์ฝ๋ฃจํด์ ๋ํ ์ดํด๋ฅผ ๋์์ค๋๋ค.
Table of Contents
์ฝ๋ฃจํด(Coroutine)์ Cooperative routine์ ์๋ฏธํ๋ฉฐ ์๋ก ํ๋ ฅํ๋ ๋ฃจํด์ด๋ผ๋ ๋ป์ด๋ค. ๋ฉ์ธ ๋ฃจํด๊ณผ ์๋ธ ๋ฃจํด์ฒ๋ผ ์ข ์๋ ๊ด๊ณ๊ฐ ์๋ ์๋ก ๋๋ฑํ ๊ด๊ณ์ด๋ค. ๊ธ์ ์ ๋ถ ์ ๋ ํ ํ ๋ค์ ์ฌ๋ผ์์ ๋๋ ์ถฉ๋ถํ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค.
์ง์ ๋๊ตฌ๋ ์ดํดํ ์ ์๋ ์ฝ๋๋ก ์์๋ฅผ ๋ค์ด๋ณด๊ฒ ๋ค.
์์1)
void start(){
startA();
startB();
}
void startA(){
for(int a=0;a<10;a++){
Debug.Log("a");
}
}
void startB(){
for(int b=0;b<5;b++){
Debug.Log("b");
}
}
ํ๋ก๊ทธ๋จ์ startA์ a๊ฐ ์ด๋ฒ, startB์ b๊ฐ ๋ค์ฏ๋ฒ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์์๋ ๋ค๋ฅด๊ฒ ๋์์ ์ผ์ด๋๋ ๊ฒ์ฒ๋ผ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๊ณ ์ถ๊ฑฐ๋ ์ฝ์๋ ์ ํธ๋ฅผ ์คฌ์ ๋ ์์ํ๋ ๋น๋๊ธฐ๋ฅผ ๊ตฌํํ ๋ ์ฝ๋ฃจํด์ ์ฌ์ฉํ๋ค.
์์2)
์ฝ๋ฃจํด์ ๊ณต์๋ฌธ์์์๋ ํ ์ค๋ธ์ ํธ์ ํฌ๋ช
๋๋ฅผ ์์ ํ ํฌ๋ช
ํด์ง ๋๊น์ง Fadeout์ํฌ ๋ ์ฝ๋ฃจํด์ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ค๊ฐ๊ฐ์ ์๊ฐ์ ์ผ๋ก ์ ์ ์๊ณ ์๊ฐ์ ์ผ๋ก ํฌ๋ช
ํด์ง๋ฏ๋ก ์ฝ๋ฃจํด์ ์ด์ฉํ์ฌ ํฌ๋ช
๋๋ฅผ ์ค์ ํ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค. ์๋ ์ฝ๋๋ ์์๊ฐ์ ํฌ๋ช
๋๊ฐ 0์ผ๋ก ๋ณํด๋ฒ๋ฆฐ๋ค.
void Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
}
}
์๋ ์ฝ๋๋ ์ฝ๋ฃจํด์ ์ ์ฉ์ํจ ์ฝ๋์ด๋ค. ์ ํด์ง ์๊ฐ์ด๋ ํ๋ ์๋ง๋ค ํฌ๋ช ๋๋ฅผ ์์ํ ์ค๊ฒ ์์ ์ด ์๋๋ฅผ ์ปจํธ๋กคํ ์ ์๊ฒ ๋๋ค.
IEnumerator Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield return null;
}
}
๊ฒฐ๋ก ๋ง ๋งํ์๋ฉด ์ฝ๋ฃจํด์ ํ๋ ฅํ ๋ฉํฐํ์คํน(cooperative multitasking)์ ๊ตฌํํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฝ๋ฃจํด์ด ์ฃผ๋ ์ด์ ์ด ๋ง๋ค๊ณ ์ด์ผ๊ธฐ ํ ์ ์๋ค.
ํ๋ ฅํ ๋ฉํฐํ์คํน์ ์ผ์ข ์ ์๋ถํ - time sharing ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ task๊ฐ ํ๋์ CPU๋ฅผ ๋๋ ์ฐ๋ ๋ฐฉ์์ธ๋ฐ ์ด์์ฒด์ ์ ๊ฐ์ ์์ด ๊ฐ task๊ฐ ๋ ์ ์ ์ผ๋ก CPU๋ฅผ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์ด ๋๋๋ฉด ์๋ฐ์ ์ผ๋ก ์๋ณดํ๊ฒ ๋๋ค. ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ ๋์ค ๊ฐ์ ๋ก CPU๋ฅผ ์ ์ ํด๊ฐ๋ ์ผ์ด ์์ผ๋ฏ๋ก ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ๋ณดํธํ๊ธฐ ์ํ ๋๊ธฐํ ์๋จ์ด ํ์ ์๋ค๋๊ฒ์ด ๊ฐ์ฅ ํฐ ์ด์ ์ด๋ค.
์ผ๋ฐ์ ์ธ ํจ์์ ์ง์ ์ ์ ํจ์์ ์์ ๋ถ๋ถ์ด๋ค. ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ํจ์์ ์์ ๋ถ๋ถ๋ถํฐ return์ด๋ ํจ์์ ๋๊น์ง ์คํ์ ํ ํ ํจ์๋ฅผ ์ข ๋ฃํ๋ค. Coroutine์ ์ฌ๋ฌ๊ฐ์ ์ง์ ์ ๊ณผ ์ฌ๋ฌ๊ฐ์ ์ค๋จ์ ์ ๊ฐ์ ธ ๋ฃจํด์ด ์ข ๋ฃ๋๊ธฐ ์ ์ ๋ช๋ฒ์ด๋ ์ง์ ๊ณผ ์ค๋จ์ด ๊ฐ๋ฅํ๋ค.
๋ํ ์์์ ์ธ๊ธํ ๊ฒ๊ณผ ๊ฐ์ด ํจ์๋ return์ ์ฌ์ฉํ์ง๋ง ์ฝ๋ฃจํด์ suspend(์ค๋จ)์ ์ฌ์ฉํ์ฌ ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ค์ resume(์ฌ๊ฐ)ํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ ์ด๊ถ์ ํธ์ถ์์๊ฒ ๋ค์ ๋๊ธฐ๊ฒ ๋๋ค.
Background Task๋ผ๋ ์ ๊ณผ ๋น๋๊ธฐ๋ก ์ผ์ด๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ถ๋ถ์์๋ ๊ณตํต์ ์ด ์์ด ๋ณด์ด์ง๋ง ๊ฐ๋ ์ด ๋ค๋ฅด๋ค. ์ฝ๋ฃจํด์ ํน์ ์์ ์ ๋จ๊ณ์ ์ผ๋ก ์ชผ๊ฐ์ด ์์ฐจ์ ์ผ๋ก ๋ฐ์ํ๊ฒ ๋ง๋ค๊ณ ๋ฉ์ธ ๋ฃจํด๊ณผ ๋์์ ๋ฐ์ํ์ง ์๋๋ค๋ ํฐ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค. ๋ํ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ค์ ๋ก ์ฝ๋ฃจํด์ ๋ณ๋ ฌ์ ์ผ๋ก ์ํ๋๋ ๊ฒ์ด ์๋ ์์ ์ ์๊ฒ ์ชผ๊ฐ์ ๋์์ ์ผ์ด๋๋๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒํ๋ ๋ฉํฐํ์คํน๊ณผ ๋น์ทํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค. ํ์ง๋ง ์ค๋ ๋์ ๊ฒฝ์ฐ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ค์ฌ์ผ๋ก ํ๋์ ํ๋ก๊ทธ๋จ์์ ๋์์ ๋ง์ ์ผ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค. ์๋์ ์ฌ์ง์์ ๋ ์ดํด๋ฅผ ๋์์ค๊ฒ์ด๋ค.
StartCoroutine(ํจ์์ด๋ฆ())์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ์์ ์ฝ๋์ StartCoroutine์ ์๋์ ์ฝ๋์ฒ๋ผ ์ ์ฉ์ํฌ ์ ์๋ค.
C#
void start(){
StartCoroutine(startA());
StartCoroutine(startB());
}
IEnumerator startA(){
for(int a=0;a<10;a++){
Debug.Log("a");
yield return null;
}
}
IEnumerator startB(){
for(int b=0;b<5;b++){
Debug.Log("b");
yield return null;
}
}
๋ฐ์ดํฐ์ ๋ชฉ๋ก์ ํ๋์ฉ ๋๊ฒจ์ค ๋ ์ฌ์ฉ๋๋ ์ธํฐํ์ด์ค๋ก, ์ฝ๋ฃจํด์ ํธ์ถํ ํจ์์ ์๋ก ์ํธ์์ฉํ๋ฉฐ ์งํํ๋๋ก ์ค๊ณ๋์ด ์๋ค. ํธ์ถํ ํจ์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์ฐ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํ ๋ ์ฌ๊ณ ์๋ ์ฝ๋ฃจํด์ด ์ผ์ด๋์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ , ๋๊ฒจ์ฃผ๋ ๋ฐ๋ณตํ๋ ๊ตฌ์กฐ๋ก ๋์ํ๊ฒ ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ง๋ค ํด์์ ์ฐจ์ด์ ์ด ์์ ์ ์์ง๋ง C#์ yield ํค์๋๋ ํธ์ถ์(Caller)์๊ฒ ์ปฌ๋ ์ ๋ฐ์ดํ๋ฅผ ํ๋์ฉ ๋ฆฌํดํ ๋ ์ฌ์ฉํ๋ค. ํํ Enumerator(Iterator)๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์งํฉ์ ์ธ ๋ฐ์ดํฐ์ ์ผ๋ก๋ถํฐ ๋ฐ์ดํ๋ฅผ ํ๋์ฉ ํธ์ถ์์๊ฒ ๋ณด๋ด์ฃผ๋ ์ญํ ์ ํ๋ค. C++์ iterator(๋ฐ๋ณต์)์ ๊ฐ์ ๊ฐ๋ ์ด๋ค.
- yield return null
๋ค์ ํ๋ ์๊น์ง ๋๊ธฐ
- yield return new WaitForSeconds(time)
time์ด ๋งํผ ๋๊ธฐ
- yield return new WaitForFixedUpdate()
๋ค์ FixedUpdate๊น์ง ๋๊ธฐ
- yield return StartCoroutine(string name)
๋ค๋ฅธ ์ฝ๋ฃจํด์ด ์ค๋จ๋ ๋๊น์ง ๋๊ธฐ