์๋ ๋ถํฐ ์คํํฌ๋ํํธ2 ์ ๋์ฒ๋ผ ์ด๋ํ ๋ ๋์ ์ฅ์ ๋ฌผ(์ ๋)์ ๋ํ ํํผ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ป๊ฒ ํ ์ง ๊ณ ๋ฏผ์ด ๋ง์์.
์คํ2๋ ์งํ ๊ธธ์ฐพ๊ธฐ๋ ๊ทธ๋ฅย ํ์ผ๊ธฐ๋ฐ AStar๊ฐ์๋ฐ, ์ ๋๋ค์ ๊ทธ๊ฒ ์๋๋ผ Boid๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ผ๊ณ .
๊ทผ๋ฐ Boid ํํ ๋ฆฌ์ผ๊ฐ์ ๊ฑฐ ๋ณด๋ฉด Boid๊ธฐ๋ณธ๊ธฐ๋ฅ๋ง ๊ฐ์ง๊ณ ๋ ์คํ2์ฒ๋ผ ์๋๋๋ผ? ๊ทธ๋ฅ Seek๋ Separation๊ธฐ๋ฅ๋ง ํค๋ฉด ์๋์ฒ๋ผ ๋์ด
์๋ก๋ฅผ ํผํ ์ค์์๋๋ฐ ์ฅ๋ฒฝ์ด ์์ผ๋ฉด ์ ๋ ๊ฒ ๋ชป์ง๋๊ฐ๋ฒ๋ฆฌ๋ ์ ๋ค์ด ์๊ธธ์๋ฐ์ ์์. ์ด๊ฒ ๋ง์ฝ ์ ๋ค์ด V์ ๊น๋๊ธฐ(Convex Shape)๋ก ์์์ผ๋ฉด ์ ๊ฒ ๋ ์ฌํด์ง.
์ ๊ฒ๋๋ฌธ์ 2๋ ๋์ ๋๋ ์๋ค๊ฐ ์๋ฒฝํ์ง ์์ง๋ง ๊ทธ๋๋ 90% ๋ง์กฑํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์!
ํ ๊ณ ๋๋ค ์ ํผํ๋ค ใ ์ด๋ฟ๋ค! ํฃ
์ด๊ฒ ๊ทธ๋ฅ ์คํ1์ฒ๋ผ ์ ๋๋ ์ฅ์ ๋ฌผ๋ก ํ๋จํ๊ณ AStarํ๋ฉด ๋ ์๋ ์์ง๋ง, ๊ฑฐ๊ธด ๊ฑฐ๊ธฐ ๋๋ฆ๋๋ก ๋ฌธ์ ์ ๋ค์ด ์๊ฑฐ๋ .
๊ทธ๋์ ์ด๋ป๊ฒ๋ Boid๋ก ํด๊ฒฐ์ ํด๋ณด๊ณ ์ถ์์.
๋ญ ์ฌ๊ธฐ ์ธ๊ฐค์๋ ์ด์ ๋์ฏค์ ๋ช์ผ๋ง์ ๊ฑ ํด๊ฒฐํ๊ฒ ์ง๋ง, ๋๋ฆ ๋ช๋ ๋์ ๊ณ ๋ฏผํด์ ํด๊ฒฐํ๊ฑฐ๋ผ ๊ธฐ๋ฟ๋ค!
ํด๋น ๋๊ธ์ ์ญ์ ๋์์ต๋๋ค.
Boid์ Separation,Seek๋ ๋ณ๊ฐ๋ก Avoidance๋ผ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑด๋ฐ, Seek๊ฐ ๋ชฉ์ ์ง(Destination)์ด ์์๋๋ง ๋์ํ๋๊ฒ์ฒ๋ผ, Avoidance๋ ๋ชฉ์ ์ง๋ฅผ ๊ฐ์ง๊ณ ๋์ํจ. ๋ชฉ์ ์ง๋ฅผ ํฅํ๋ ๋ฒกํฐ ์์ ์ ์ด ์์ผ๋ฉด, ์ข ํน์ ์ฐ๋ก ํผํ๋๋ก Steer๊ฐ์ ์ฃผ๋ฉด๋จ. ๋จ, ์ข๋ก ๊ฐ๊ธฐ๋ก ํ์ผ๋ฉด ํ 5์ด๋์์ ๋ฌด์กฐ๊ฑด ์์ ์ฅ์ ๋ฌผ์ด ์์ผ๋ฉด ๋ฌด์กฐ๊ฑด ์ข๋ก ๊ฐ๊ฒ ํด์ผ๋จ. ๋
์ค ๋ฐ๋ก ์ดํดํ์, ํ๋ฐ boid๋ ์ฒ์๋ถํฐ ๊ทธ 3๊ฐ์ง ๊ธฐ๋ฅ ๋ค ์์ง ์์์?
๊ทธ Avoidance ์์ ๋ก ๋ณธ๊ฑฐ ๋๋ก ํด๋ดค๋๋ฐ, ๋ง ๋ฒฝ์ฒ๋ผ ๊ฐ๋ก๋ง๊ณ ์์ผ๋ฉด ์๋๋๋ผ๊ณ . ๋ด๊ฐ๋งํ Avoidance๋ ๊ทธ ์์ ๋ ๋ค๋ฅด๊ฒ ๊ทธ๋ฅ ํ๋ฐฉํฅ์ผ๋ก ์ผ์ ์๊ฐ๋์ ๊ฐ๋๊ฒ๋ฟ์. ์ด๊ฑด ์์ ์คํ2 gif์ ๋ณด๋ฉด, ์ ๊ธ๋ง์ด ํ๋ฐฉํฅ์ผ๋ก๋ง ๊ฐ๋ค๊ฐ ๋ค์ ๋ฐ๋๋ฐฉํฅ ๊ฐ๋๊ฑฐ ๋ณด์ผ๊ฑฐ์ผ. ์ ์ง ์ ๋ด๋ ๊ทธ๋ ๊ฒํ๊ฑฐ๊ฐ์์๋ฆฌ.
์ค!! ๋ฉ์์
ํด๋น ๋๊ธ์ ์ญ์ ๋์์ต๋๋ค.
ใดRVO๋ฅผ ์ดํดํ๊ณ ๋ง๋ค์๋จ๋ง์ผ? ๋ ๋ฌธ์๋ณด๊ณ ์ด๊ฑด ๋ด๊ฐํ ์์๋๊ฒ ์๋๊ฑฐ๊ฐ์ ํฌ๊ธฐํ๋๋ฐ..
ํฉํธ: ์ธ๊ฐค๋ฌ๋ค ์ด๋ฐ๊ฑฐ ํ ์ค๋ชจ๋ฅธ๋ค
ํด๋น ๋๊ธ์ ์ญ์ ๋์์ต๋๋ค.
Lockstep๊ธฐ๋ฐ์ด๋ผ ์์น๊ฐ๊ฐ์ ๋๊ธฐํ๋ ์์. ํด๋ผ์ด์ธํธ๋ผ๋ฆฌ๋ ์ ๋ ฅ๋ง ์ฃผ๊ณ ๋ฐ์๊ฑฐ์ผ
์๋ฅผ๋ค์ด ํ๋ ์ด์ด๊ฐ X,Y์์น๋ก ๊ฐ! ํ๊ณ ์ ๋ ฅ์ ์ฃผ๋ฉด, ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์์๋ ๊ทธ ์ ๋ ฅ๋ง ๋ฐ์์ '๋๊ฐ์ด' ์๋ฎฌ๋ ์ด์ ๋ง ํ๋๊ฑฐ์ง. ๊ทธ๊ฒ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด์ ์ ๋ํฐ์ NavMeshAgent๊ฐ์ ํธ๋ฆฌํ๊ฑด ์ฌ์ฉ๋ชปํ๊ณ , ์ด๋ ๊ฒ ์ง์ ๊ตฌํ๋ฐ๋ก ํ๊ฑฐ๊ณ .
์ค์ ๋ก ๋ด ์ฒซ ํ์ฌ์์ ๋ง๋ ๊ฒ ๋ชจ๋ฐ์ผ AOS์ฅ๋ฅด, Lockstep์ผ๋ก ๋ง๋ ๊ฑด๋ฐ. ๊ทธ ์ค๋ ธ์ฐ๋ณผ ์์์ ์ฐพ๋๊ฑฐ๊ฐ ์ ๋ง ํ๋ค์ง ใ . ์ฒจ์ 5๋ถ๋ง๋ค ์ฑํฌ๊ฐ ์๋๊ฐ๋๋ฐ, ๋์ค์ ์๋์ค๊ธธ๋ ๋ฌ๋ค ์ถ์๋๋ฐ, 2์๊ฐ๋ค์ ์๋๊ฐ๋ ๊ฒฝ์ฐ๋ ์๋๋ผ๊ณ . ๋ช๊ฐ์ง๋ง ์ง์ผ์ฃผ๋ฉด ๊ฑฐ์ ์๋๊ฐ๋ ์ผ์ ์์. 1.์ ๋ ์ ๋ํฐ์ Update์ ์์กดํ๋ ๊ฒ๋ค์ ์ฌ์ฉํ๋ฉด ์๋จ.(Physics,NavMesh๋ฑ) 2. Dictionary, HashSet์ foreachํ๋ ํ๋(์ํ ์์๊ฐ ํ๋ซํผ๋ง๋ค ๋ค๋ฆ) 3.float ์ ๋ ์ฌ์ฉํ์ง ๋ง๊ฒ. FixedFloat์ฌ์ฉํด์ผํจ. ๋น๊ทผ ์ ๋ํฐ์ Time.deltaTime๊ฐ์๊ฑด ์ฌ์ฉ๋ถ๊ฐ์ง.
A* ๋ฌธ์ ๋จธ๊ฐ ์์ด?
A*์ ๋ฌธ์ ๋ผ๊ธฐ๋ณด๋ค๋, A*๋ก ํจ์ค๋ฅผ ์ฐพ์ ๋ค๊ฐ ๋ฌธ์ . ๋์ ์ฅ์ ๋ฌผ์ด ๋ด๊ฐ ์ฐพ์ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ก๋ง๊ณ ์์ผ๋ฉด, ๋ค์ ํจ์คํ์ธ๋ฉ์ ํด์ผ๋๊ฑฐ๋ .
๊ทผ๋ฐ ์ด๊ฒ ๋ชฉ์ ์ง๊ฐ ๋๋ฌด ๋จผ๋ฐ, ์์์ง์ ๋ถํฐ ๋์ ์ฅ์ ๋ฌผ์ ๋งํ๋ฉด ๊ฒฝ๋ก๋ค์ ๊ณ์ฐํ๋ฉด ๋ถํ๋ ์๊ณ , ๋งต์ ์ฒด์ ๋์ ์ฅ์ ๋ฌผ์ ์ฅ์ ๋ฌผ๋ก ์น๊ณ ๊ฒฝ๋ก๊ณ์ฐ์ ๋ค ํ๋๊ฒ๋ ์ข ์ด์ํ๊ฑฐ๋ . ์๋ฅผ๋ค์ด ์๋ ์คํํฌ๋ํํธ ๋กํ ๋งต์์, SCV๋ก ์ ์ง์ ์์ฐฐ๊ฐ๋๋ฐ, ์ ์ด ์ ๊ตฌ๋ง์๋ฒ๋ฆฌ๋ฉด, SCV๋ก ์๋ณด์ด๋ ์ ์ง ์ฐ์์๋ ์ด์ํ๊ฒ ์์ง์ด๋ฉด ์ ๊ตฌ๋งํ์ ์ด์ํ๋ฐ๋ก ์์ง์ด๊ฑฐ๋ , ๊ทธ๋ผ ์๊ฐ๋ด๋ ๊ฑฐ๊ธฐ ์ ์ด ์๋ค๋๊ฑฐ ๋ฐ๋ก ์์ ์๋ฏ์ด. ์ด๋ฐ ๋ฌธ์ ๋ ์๊ณ
์์ ์ ํ๋ ๊ธฐ์ต์ผ๋ก๋ ๊ทธ๋์ ๋์ ์ฅ์ ๋ฌผ๋๋ฌธ์ ์์ธ์ฒ๋ฆฌํ๋๋ผ ์ฝ๋ ์ค๋๋๋ฌ์์ก์์...
์ด ๊ทธ๋ฌ๋ค ๋์ ์ฅ์ ๋ฌผ ์ฒ๋ฆฌํ๋๊ฒ ๋ฌด์กฐ๊ฑด ์ฅ์ ์ธ์ค ์์๋๋ฐ ์๋๊ฒฝ์ฐ๋ ์๋ค
NavMeshAgent๊ฐ์๊ฑฐ ์์ฐ๋์ด์ ๊ฐ์๋? ๋์ ๊ฐ์ฒด ํจ์คํ์ธ๋ฉ ์ง์๋๋๊ฑฐ๊ฐ์๋ฐ ๋ฌด๊ฑฐ์์?
๋คํธ์ํฌ ๋๊ธฐํ๋ก Lockstep๊ธฐ๋ฐ์ผ๋ก ํ ๊ฑฐ๋ผ. ์ ๋ํฐ์ FrameUpdate๋ก ์ด๋ฃจ์ด์ง๋ NavMeshAgent๋ฅผ ์ฌ์ฉํ ์๊ฐ์ ์์ ๊ทธ๋ฌ์ด
ํด๋น ๋๊ธ์ ์ญ์ ๋์์ต๋๋ค.
๋ฐ๊ฐ๋ค ์น๊ตฌ์ผ ใ ใ ๋ค ์๋ฒํด๋ผ์์น๋๊ธฐํ ๋ฐฉ์ ์ฐ๋๋ฐ, ๋ ์๋ Lockstep๋ฐฉ์์ด ์ข๋๋ผ๊ณ . ใ ใ
๊ทธ๋ฆฌ๋ ๋ณด๋ฉด ๋๋ ์ง๋๋ฐ HPA* ๋ง๋ ๊ฑฐ์?
์ ๊ฑฐ ๊ทธ๋ฅ Boid๋ผ๋ฆฌ ๊ทผ์ฒ์์๋ ์ ๋ค ์ฐพ์๋ ์ต์ ํ๋ฅผ ์ํด์ ์ด QuadTree ๋๋ฒ๊ทธ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฑฐ์. ํน์ ๊ตฌ์ญ์ Boid๊ฐ ๋ง์ด ๋ชจ์ด๋ฉด ๊ทธ๋ถ๋ถ์ ํธ๋ฆฌ ๋์ค๊ฐ ํ๋ ๋ ๋์ด๋๋๊ฒ ๋ณด์ด๋๊ฑฐ.
๊ทธ๋ ๊ตฌ๋ ๋ต๊ธ ใฑใ ใฑใ
https://arongranberg.com/astar/docs_rvo_fix/local-avoidance.php
์ด๊ฑธ๋ก
ํด๊ฒฐ๊ฐ๋ฅํ๋๋ฐ
ใ ใ ๋ง์. ์ ๊ฒ๋ ๋ณด๊ธดํ๋๋ฐ. Lockstep๋๋ฌธ์ ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์๊ฐ ์์์ด. float์ฐ์ฐ์ ์ฐ๋ฉด ์๋๊ฑฐ๋ . FixedFloat๋ฅผ ์ฌ์ฉํ๋ LocalAvoidance ํ๋ ์์ค์ ์ฐพ์์๊ฐ ์๋๋ผ๊ณ .
์ค... ๊ทธ๋ฐ๊ฒ๋ ์๊ตฌ๋ ๊ณต๋ถ๊ฐ ๋๋ค
118.241 local avoidance์๋ ค์ค์ ๊ฒ์์ฝ์ง ํด๊ฒฐ ใณใณ
์์ด์คํ๋ก ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ ๋ณด์ด๋๋ก ๊ทธ ๊ฒฝ๋ก๋ก steeringํ๋๊ฑฐ์? ์ค
๋ค์ ๋ชฉ์ ์ง๋ฅผ ํฅํด ์คํฐ์ด๋งํ๊ณ ์ด๋ณด์ด๋์ค ํ๋ฉด ๋๋๊ฑฐ์์? ์ค...
๋์ ์ผ๋ก ๊ธธ๋งํ๋ฉด ์์ด์คํ ๋ค์ํด์ผํ๋๊ฑฐ์๋? ์ด๋ ต๋..
๋ง์. ์งํ์ง๋ฌผ ํผํ๋๊ฑด A์คํ๋ก, ๊ทธ ์งํ์ ๋์๋ค๋๋ ์ ๋ค์ Boid๋ก Steeringํด์ ํผํ๋๊ฑฐ. ์ด๊ฒ ๊ทธ๋๋ง ๊ฒ์๋ง๋ค๋ ์ฌํํ๊ฑฐ๊ฐ๋๋ผ๊ณ
์ธ๊ฐค ํ๋ก๊ทธ๋๋จธ ์์ 0.01ํผ์ผํธ
์บฌ ใ ใ ใ ใ
A*๋ฅผ ์ง์ ์ง๋ ธ...
A*๊ฐ๊ณ 4๊ฐ์ ๊ณ ๋ฏผํ ์ธ๋ถ์ดํํ ๋ ๊ฟ๊ฐ์ ์ด์ผ๊ธฐ!! ๊ฐ์ถ ใ ใ ใ ใ ใ
์ ์๋ fixed float์ด ๋ญ๊ฐ์
1+4=5๋ผ๋ ๊ณ์ฐ์ amd๋ intel,arm(๋ชจ๋ฐ์ผ) ๋์ผํ์ฃ ? ๊ทผ๋ฐ 1.1+1.98=3.08์ด๋ผ๋ ๊ณ์ฐ์ amd๋ cpu,arm ๋ค ๋ค๋ฅผ ์ ์์ด์. ์ํผ์ ๋ณ๋ก ์ถ๋ ฅํด๋ณด๋ฉด 3.080000001,๊ฐ์ด ๊ฐ์ ์ํผ์ ๋ณ๋ก ์ ํํ๊ฒ ๋จ์ด์ง์ง ์์์์์ด์. ์ด๊ฑด float๋ณ์๊ฐ floating point(๋ถ๋์์์ )์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ๋ฐ์.
์ ํํ๊ฒ์๋๊ฑด์๋์ง๋ง ์ ๋ถ๋์์์ ์ด ์ํผ์ ๋ณ๋ก ๊ณ์ฐ์ด ๋ค๋ฅด๋ค๊ณ ํด์. ๊ทผ๋ฐ fixed point(๊ณ ์ ์์์ )์ด๋ผ๊ณ ์ ๊ฐ ์์์ ์ธ๊ธํ fixedfloat๋ผ๊ณ ๋งํ๋๋ฐ, ์ด๊ฑด ๋ด๋ถ์ ์ผ๋ก int์ฒ๋ผ ๊ณ์ฐ์ํด์ ์ด๊ธ๋๋๊ฒ ์๋ค๊ณ ํด์. ์ด fixedPoint๋ ํ๋ก๊ทธ๋จ์ธ์ด์ฐจ์์์ ์ง์ํ๋ ํ์ ์ ์๋๋ผ์, int์ ์๋ฅผ ๋ํํ ํ์ ์ผ๋ก ๋ง๋์ ๋๋์ฉ
Lockstep๊ธฐ๋ฐ ๋คํธ์ํน์ ์๋ฎฌ๋ ์ด์ ๊ฒฐ๊ณผ๊ฐ ์ปดํฐ๋ง๋ค ๋ค ๋์ผํด์ผํด์ ๋ค๋ฅธ์ํผ์ ๋ผ๋ฆฌ ๊ณ์ฐ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด์ง ์๊ฒ ํด์ผ๋๊ฑฐ๋ ์. ๊ทธ๋์ fixedpoint๋ฅผ ์จ์. ์๋ ๊ฒ์์ lockstep๋๊ธฐํ๊ฐ ์ฌ์๋ ์ด์ ๋ ๊ธฐ๊ธฐ๋ค์ด ๊ฑฐ์ง ๋ค ๋น์ทํด์ ์๋ฎฌ๊ฒฐ๊ณผ๊ฐ ๋น์ทํ๋ค๋ ์๊ธฐ๋ ์๊ณ , ๊ทธ๋น์ ์ํผ์ ๋ค์ด ์์์ ๊ณ์ฐ๋ฐฉ์์ด ์ ๋ถ ์ธํธ์ฌ์ ๊ทธ๋ซ๋ค๋ ์ผ๊ธฐ๋ ์์ด์ฉ
์ฌ๋ฐ์ด๋ณด์ด๋ค
RTS๊ฐ ์ ์๋ ์ด์ ๋ ์ฅ๋ฅด์์ฒด๊ฐ ์ฌ์ฅ์ธ๊ธฐ๋ ํ์ง๋ง ๋ง๋ค๊ธฐ๋ ๋ณด๊ธฐ๋ณด๋ค ๊ฒ๋ ๋นก์ธ์์ธ๊ฒ ์๋๊ฐ ์ถ๋ค