UniTask๋ฅผ ํ์ด๋ณด๋๋ฐ ์ด๊ฒ ๋ฉ์ธ์ฐ๋ ๋์ธ์ง ๋ณ๋์ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ๋์ง ๊ธด๊ฐ๋ฏผ๊ฐํด
๊ณต์ ๋ฌธ์๋ ๊ตฌ๊ธ๋งํด์ ๋์ค๋ ๋ฌธ์๋ค ์ฝ์ด๋ณด๋ฉด ์ฝ๋ฃจํด ๋น์ทํ๊ฒ ์ ๋ํฐ ๋ฉ์ธ์ฐ๋ ๋ PlayerLoop์ ๋ผ์ ๋ฃ์ด์ ์ฒ๋ฆฌํ๋๊ฑฐ ๊ฐ์๋ฐ
๋๊ตฐ ๋ ๋ฉํฐ์ฐ๋ ๋๋ผ๊ณ ํ๋ ์ด๋ค๊ฒ ๋ง๋์ง ์ข ์๋ ค์ค
UniTask ๊ฐ๋ฐ์๊ฐ ์ง์ ์ด UniTask ์๊ฐ๋ฌธ์.
https://neuecc.medium.com/unitask-a-new-async-await-library-for-unity-a1ff0766029
C# Task๋ ์ ๋ํฐ์์ ๋ฌด๊ฒ๊ธฐ๋๋ฌธ์ UniTask๋ฅผ ํตํด ๊ทธ๊ฒ์ ํด์ํ๋ค๊ณ ํจ. ๊ทธ๋ฌ๋๊น Task ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ผ๋๊ฑฐ. ๊ทผ๋ฐ ์์ ์ฝ๋ ๋ณด๋๊น ๋ฉํฐ์ค๋ ๋ ๊ด๋ จ ์ฝ๋๋ ์๋๊ฑฐ ๋ณด๋๊น ๋ฉํฐ์ค๋ ๋๋ ์ง์ํ๋๋ฏ? ์์ธํ๊ฑด API ํ์ด๋ณด๋ฉด ์๊ฒ์ด๊ณ , ์ฌํผ Task ๋์ฒดํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์๋ฐ
ใ ใ ๋๋ Git ๊ด๋ จ ๋ฌธ์ ์ฝ์๋๋ฐ ๋ฌธ์ ๋ด์ฉ์ ๋ง๋๊ฑฐ ๊ฐ์๋ฐ ํ์ ์ด ์ ์๋๋ผ๊ณ
๋งํฌ ์๊ฐ๋ฌธ์ ๋ชป ๋ดค๋๊ฑด๋ฐ ๋ค์ ์ฝ์ด๋ณผ๊ฒ ๊ฐ์ฌ!
๋ด๊ฐ ๋งํฌํ ๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ ํ์ํฌ์ธํธ ๋ด๋ผ. ๊ฑฐ๊ธฐ์ ๋ค๋์ด.
11 ํ์ด์ง๋ถํฐ ๋๊ฐ ์ฐพ๋๊ฑฐ ๋์ค๋๋ฏ
์ ๋ง๋ค ํ๋ฃจ์ข ์ผ ๋ค์ก๋๋ฐ ํํ์ค๋ค ใ ใ ใ ใ
๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ํฐ ํ๋ ์ด์ด๋ฃจํ ์ด์ฉํด์ ๋ฉ์ธ์ฐ๋ ๋์์๋ง ๋์๊ฐ๋๊ฑฐ ๋ง๊ณ ์ฐ๋ ๋ํ๋ก๋ ๊ฐ๋ฅํจ
ํ์ ์ด ์์๋๋ฐ ๋๋ถ์ ์ ๋ฆฌ๊ฐ๋จ. ๋ฌธ์์ ThreadPool limitation? ํญ๋ชฉ์ Run.Task๋ผ๋๊ฒ ๋ ์ง์ ์ํด์ ํ์ฌ๋ ์ฐ๋ ๋ํ ์ฐ๋์ง ๋ชฐ๊ฒ ์.
์์ํ๊ธฐ ์์ ์๋ ์๋๋ฐ await UniTask.SwitchToThreadPool(); ์ดํ๊ฐ ์ฐ๋ ๋ํ์์ ๋์ํ๊ณ ๋ค์ ๋ฉ์ธ์ฐ๋ ๋๋ก ์ค์์นญํ ๋ await UniTask.SwitchToMainThread(); ์ฐ๋ฉด๋จ UniTask.Run()์ ๋์ฒดํ๋ ๋ฉ์๋๋ UniTask.RunOnThreadPool()
C#์ Task๊ฐ ์ํ๋ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ณ๋์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํจ. ์ด๊ฑธ ๋ฉ์ธ์ค๋ ๋์์ ์คํ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋๊ฒ SynchronizationContext์. ๊ทผ๋ฐ ์ ๋ํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ํฐ ์ปค์คํ SynchronizationContext๊ฐ ์ธํ ์ด ๋์ด ์์ด์ ๋ณ๋์ ์ค๋ ๋์์ ๋์๊ฐ์ง ์์. ๋๋ฌธ์ ์ง๋ฌธ์ ๋ต์, ์ ๋ํฐ์ Task๋ UniTask๋ฅผ์ฐ๋ Task๋ฅผ ์ฐ๋ ๋ฉ์ธ์ค๋ ๋์์ ๋์๊ฐ๋ค ์ด๋ง์.
https://docs.unity3d.com/2020.1/Documentation/Manual/overview-of-dot-net-in-unity.html
๋งจ
์๋๋ด์ฉ ์ฐธ์กฐ
๋ ์ ๋ํฐ์์ Task์ธ๋ ๋ฉ์ธ์ค๋ ๋์์ ๋๋ค๊ฐ, ๋ณ๋์ C#ํ๋ก์ ํธ(๋ท๋ท์ฝ์ด)์์ ํ ๋ ๋ณ๋์ ์ค๋ ๋์์ ๋์๊ฐ๊ธธ๋, ๋ญ๊ฐ ํ๋๋ SynchronizationContext๋ผ๋ ์กด์ฌ๊ฐ ๊ทธ๊ฑธ ๊ฒฐ์ ํ๊ณ ์์์