์๋ฌธ)ใUnityใ่คๆฐใฎ้ๅๆๅฆ็ใ็ดๅใซๅฎ่กใใๆฉๆงใไฝใ
์ค๊ตญ ๊น ํ๋ธ ๋ณด๋๋ฐ, ์คํฌ์์คํ ๊ตฌํ์์ ์ํฅ๋ฐ์ ์ฝ๋ ๋ณด๋ ์ค์ ์ฐพ์์ ๊ฐ์ ธ์๋ดค๋ค
์ผ๋ณธ์ชฝ ์ฝ๋ ๊ฐ์๋ฐ,ย
๋ด๊ฐ ์๊ฐํ๋ ์์ฉ๋ฐฉ๋ฒ์ ์ฃผ๋ฌธ ์์ ์ ๋ํ๋ด๋ ์บ์คํ ์ ํ์คํฌ๋ก ์ฒ๋ฆฌํ๊ณ , ์ด ์ ๋๋ฉ์ด์ ์ฒ๋ฆฌ์ ๋ํ ์ ๋ณด๊ฐ ํ์ ๋๊ธฐ์ด์ ์ถ๊ฐ๋๊ณ
์ด๋ฌํ ํ์คํฌ๋ฅผ ํ์ด๋ฐ๊ณผ ์กฐ๊ฑด์ ๋ฐ๋ผ์, ์ฐ์ ์์๋ฅผ ์ค์ ํด์ ์กฐ์ ํด์ ์คํํด๋๋ฉด
์คํฌ์ ์ ์ ๋ ฅ ์์คํ ์ ๋ง๋ค ์ ์์ง ์์๊น?ย
๋ญ ๋ฌผ๋ก ๋๋ค๊ฐ ์ ์๊ฒ ์ง
์๊ฐ
(URL ๋ชฉ๋ก์ ๋ค์ด๋ก๋ํ๋๋ฐ, ํ๊บผ๋ฒ์ ๋ค์ด๋ก๋ํ์ง ์๊ณ ์์๋๋ก ๋ค์ด๋ก๋ํ๊ณ ์ถ์ ๋, ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ค.)
์ด๋ฌํ '์ง๋ ฌ๋ก ์์ ์ ์ํํ๋ ๋ฉ์ปค๋์ฆ'์ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํ์ ๋, ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ง๋ค ์ ์๋์ง ์๊ฐํฉ๋๋ค.
์ ์ ์กฐ๊ฑด
UniTask ์ฌ์ฉ
(์ญ์ฃผ: ์ค๊ตญ์ ๋คํํ ๋๋ฆฌ ํผ์ง ์คํฌ ์์คํ ๋ Unitask ๋งค๋์ ๋ฅผ ๋ง๋ ํ, ์ด ๋น์ทํ๊ฒ ์ฐ๋๋ผ)
๊ตฌํ๋ฐฉ๋ฒ
์ฐ์ ๊ฐ์ฅ ๋จผ์ ๋ ์ฌ๋ฆด ๋ฐฉ๋ฒ์ Queue<T>๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ
https://gdl.space/fuduyuqote.cs
(์ญ์ฃผ:GDL์ ๊ตฌํ ๋ณต๋ถํด๋จ์ผ๋ ์จ๋ผ)
Queue๋ฅผ ์ค๋นํด๋๊ณ , ๊ทธ๊ฒ์ while์์ ํ ๊ฐ์ฉ ๊บผ๋ด์ ์ฒ๋ฆฌํ๋ ๊ฒ๋ง์ผ๋ก ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด ๊ตฌํ์ ์ฅ์ ์ผ๋ก๋ Queue๋ฅผ PriorityQueue๋ก ๋ฐ๊พธ๋ฉด ์ฐ์ ์์๋ฅผ ์ง์ ํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๋ ์ ์ ๋ค ์ ์๋ค.
'์ง๋ ฌ๋ก ์์ ์ ์ฒ๋ฆฌํ๋ฉด์ ๋์์ N๊ฐ๊น์ง ๋ณ๋ ฌ ์คํ์ ํ์ฉํ๊ณ ์ถ๋ค'์ ๊ฐ์ ๋ณต์กํ ๋์๋ ๊ตฌํํ ์ ์์ต๋๋ค.
๋จ์ ์ 'Queue์ ๋ด์ฉ๋ฌผ์ด ๋ค ๋จ์ด์ก์ ๋'๋ฅผ ์ ๊ฒฝ ์จ์ผ ํ๋ค๋ ์ ์ธ๋ฐ, Queue๊ฐ ๋น์์ง๋ฉด ๋ฃจํ ์ฒ๋ฆฌ๊ฐ ๋ฉ์ถฐ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์
๋ค์ ๋ฒ ํ์คํฌ๋ฅผ ์ถ๊ฐํ๋ ์์ ์ ๋ค์ ๋ฃจํ๋ฅผ ๋ฐ๋์์ผ์ผ ํฉ๋๋ค.
IUniTaskAsyncEnumerable ์ฌ์ฉ๋ฒ
๋๊ธฐ ๊ฐ๋ฅํ Queue<T>๋ฅผ ์ค๋นํ ์ ์๋ค๋ฉด, '๋ด์ฉ์ด ์์ผ๋ฉด ๊ฐ์ ธ์ค๊ณ , 0์ด๋ฉด ์๋ก ์์๊ฐ ์ถ๊ฐ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค'๋ ์์ผ๋ก ์์ฑํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฅผ ๊ตฌํํ ์ ์๋ ๊ฒ์ด IUniTaskAsyncEnumerable<T>์ด๊ณ , ๊ทธ ๊ตฌํ์ผ๋ก Channel์ ์ฌ์ฉํ ์ ์์ต๋๋ค
https://gdl.space/qupelabiwe.cs
(์ญ์ฃผ: ์ญ์ Gdl ์คํ์ด์ค์ ์ ์ฅํด๋จ์ผ๋ ๋ณต๋ถํด๋ผ)
์ฅ์ ์ Queue๋ฅผ ์ด์ฉํ ๊ตฌํ๋ณด๋ค ๊ฐ๋จํ๋ค๋ ์ ์ ๋๋ค.
๋จ์ ์ ๊ทธ๋ฅ ์์ธ ์์๋๋ก๋ง ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ Priority ์ง์ (์ญ์ฃผ:์ฐ์ ์์ ์ง์ ) ๋ฑ์ ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
์ผ๋จ LINQ๋ฅผ ์ฌ์ฉํ์ฌ ๋์์ ์ปค์คํฐ๋ง์ด์งํ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, ์ด ์ฉ๋์ ํ์ฅ์ฑ์ ๊ทธ๋ค์ง ๊ธฐ๋ํ ์ ์์์ง๋ ๋ชจ๋ฆ ๋๋ค.
(์ญ์ฃผ: ์ฝ๋๋ฅผ ๋ณด๋ฉด, channelExecutor ๊ตฌํํ๋ฉด ๋ฑ๋ก๋ ์์๋๋ก ์คํ๋๋๋ฐ, ์ด๋ ์ ์ ์ ์ถ(FIFO)๋ฐฉ์์ผ๋ก ์คํ๋จ ,๋ค๋ฅด๊ฒ ๋งํด์,
์ฐ์ ์์๊ฐ ๋ชจ๋ ๊ฐ๋ค๋ผ๊ณ ๋ณผ ์ ์์. ๋ด ์๊ฐ์ ์ฌ๊ธฐ์ ์ฐ์ ์์๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ฐ์ ์์ ์์ค์ ๋๋๊ณ , Func<CancellationToken,UniTask> ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ํ์ฅํ๊ณ , ์ฐ์ ์์๋ฅผ ์๋ฝํ๋๋ก ๋ฑ๋ก๋ฐฉ๋ฒ์ ์กฐ์ ํ ์ ์์ ๊ฑฐ ๊ฐ๊ธดํจ. ๋ฌผ๋ก ๋๋ C# 7๊ฐ์์ฐจ๊ธฐ๋๋ฌธ์ ๋๋ค๊ฐ ๋ ์ ๋ง๋ค๊ฑฐ๋ผ ๋ฏฟ๋๋ค)
์์ฝ
Queue<T>๋ก ๊ตฌํํ๋ฉด ๊ด๋ฆฌ๊ฐ ์กฐ๊ธ ๋ฒ๊ฑฐ๋กญ์ง๋ง ํ์ฅ์ฑ์ด ์๋ค.
Channel<T>๋ฅผ ์ฌ์ฉํ๋ฉด IUniTaskAsyncEnumerable์ ์ฅ์ ์ ์ด๋ฆด ์ ์์ง๋ง, ํ์ฅ์ฑ์ด ๋จ์ด์ง ์ ์๋ค.
์ฅ๋จ์ ์ด ์์ผ๋ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์ค๋ง์ผ(ใใพใ)
ํ ์คํฌ์ ์กด์ฌ ์ด์ ์ด๊ธฐ๋ ํ์ง ์์ ์ ์ฐ์ ์์ ๊ฐ๋