(์ง‘ ํ•˜๋‚˜ ๋š๋”ฑ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์˜์ƒ, ๋ฐฐ์†์žฌ์ƒ)



์šฐ์„  ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋นŒ๋“œ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋„๋ก ํ•ด์•ผ ํ–ˆ์Œ




<HUD ๋ธ”๋ฃจํ”„๋ฆฐํŠธ์˜ ๋ชจ์Šต>


ํฌํ ...


์›๋ž˜ ๋” ๋ณต์žกํ–ˆ๋Š”๋ฐ ์ข€ ์ •๋ฆฌํ•ด์„œ ๋‚˜์•„์ง„๊ฑฐ์ž„


์ถ”ํ›„์— ํ•จ์ˆ˜๋‹จ์œ„๋กœ ์ตœ๋Œ€ํ•œ ์ชผ๊ฐœ์„œ ์ •๋ฆฌํ•  ์˜ˆ์ •์ธ๋ฐ ์–ธ์ œ๊ฐ€ ๋ ์ง€๋Š” ๋ชจ๋ฆ„


์•„์ดํ…œ ์‚ฌ์šฉ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํ…œ์˜ ํƒ€์ž…์„ ์ฝ์–ด์™€์„œ TestBuildable์ผ ๊ฒฝ์šฐ์—ย 

(Enum ๋งŒ๋“ค์–ด์„œ ๊ทธ๊ฑธ๋กœ ๋ฐ”๊ฟ”์•ผ๋ ๋“ฏ)


์šฐ์„  ์•„์ดํ…œ์ด 2๊ฐœ ์ด์ƒ ๋‚จ์€ ๊ฒฝ์šฐ์—” ์Šคํƒ์„ ์ฐจ๊ฐ, 1๊ฐœ์ธ ๊ฒฝ์šฐ ์‚ญ์ œ์‹œํ‚ค๊ณ 


"BuildSpawnEvent"๋ฅผ ๋ถˆ๋Ÿฌ์คŒ. ๊ทธ ๋‹ค์Œ ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ๋ฆฌํ”„๋ ˆ์‹œํ•จ




๋‹ค์Œ์œผ๋กœ


๋นŒ๋“œ ์ด๋ฒคํŠธ๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ธฐ๋Šฅ ๋‘๊ฐœ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ๋จย 


ํ•˜๋‚˜๋Š” ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์ขŒํ‘œ ๊ตฌํ•˜๊ธฐ,ย 

๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ž…๋ ฅ๋ฐ›์€ ์ขŒํ‘œ๋ฅผ ๊ทธ๋ฆฌ๋“œ๋กœ ๊ฐ–๋‹ค ๋ถ™์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ž„(Snap to grid๋ผ ๋ณด๋ฉด๋Œ)


์ง€๊ธˆ๊นŒ์ง€๋Š” ๋งˆ์šฐ์Šค์˜ ์›”๋“œ ์ขŒํ‘œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ๋งŒ ๊ณ„์‚ฐํ•ด์„œ ์˜ค์ฐจ๊ฐ€ ์‹ฌํ–ˆ์Œ

(ConvertMouseLocationToWorldSpace ํ›„ ๋ฐฉํ–ฅ์— ์Šคํ”„๋ง์•” ๊ธธ์ด๋ฅผ ๊ณฑํ•ด์ฃผ๊ณ  ์œ„์น˜๋ž‘ ๋”ํ•˜๊ณ  ๋๋ƒˆ๋˜๊ฑธ๋กœ ๊ธฐ์–ตํ•จ ์ •ํ™•ํ•˜์ง„ ์•Š์Œ)


ํ•˜์ง€๋งŒ ๊ฑด์ถ•๋ฌผ์„ ํŽธํ•˜๊ฒŒ ์ง€์œผ๋ ค๋ฉด ๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์œ„์น˜๋ฅผ ๋ฌด์—‡๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ์–ป์–ด์•ผํ•จ


๋ช‡๋ฒˆ์˜ ์‹œํ–‰์ฐฉ์˜ค ๋์— ์ •์ƒ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ƒ„





<GetMousePointingLocation>


์ˆ˜ํฌ์ž ์ถœ์‹ ์ด๋ผ ์ดํ•ด ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๊ธด ํž˜๋“ค๊ฑฐ๊ฐ™์€๋ฐ ์ตœ๋Œ€ํ•œ ๋…ธ๋ ฅํ•ด๋ด„..


์นด๋ฉ”๋ผ์˜ ์›”๋“œ ์ขŒํ‘œ๋ฅผ A, ๋งˆ์šฐ์Šค๋ฅผ B๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด


ConvertMouseLocationToWorldSpace์˜ ๋ฐ˜ํ™˜๊ฐ’ ์ค‘ World Direction(ํ™”๋ฉด์œผ๋กœ๋ถ€ํ„ฐ์˜ ๋ฐฉํ–ฅ)์— (์Šคํ”„๋ง์•” ๊ธธ์ด*N)์„ ๊ณฑํ•ด์คŒ


N๊ฐ’์ด ํด์ˆ˜๋ก ๋ฉ€๋ฆฌ๊นŒ์ง€ Trace๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ผ๋‹จ์€ 500์œผ๋กœ ์„ค์ •ํ•จ


์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๋ฒกํ„ฐ๋ฅผ C๋ผ๊ณ  ํ•˜๊ณ , ์ด ๋ฒกํ„ฐ๋Š” ์œ„์น˜๊ฐ’์ด ์•„๋‹ˆ๊ณ  ๋‹จ์ˆœํžˆ ๋ฐฉํ–ฅ๊ณผ ๊ธธ์ด๋กœ ์‚ฌ์šฉํ•จ


๋‹ค์Œ์œผ๋กœ World Location์— ์ด ๋ฒกํ„ฐ๋ฅผ ๋”ํ•ด์ฃผ๋ฉด "๋งˆ์šฐ์Šค์˜ ์ขŒํ‘œ์—์„œ C๋ฒกํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’๋งŒํผ ์ด๋™ํ•œ ์œ„์น˜ D"๊ฐ€ ๋˜๋Š”๊ฑฐ์ž„


๊ฒฐ๊ณผ์ ์œผ๋กœ A์—์„œ D๋ฅผ ๋ดค์„๋•Œ๋Š” "์นด๋ฉ”๋ผ์˜ ์œ„์น˜๋กœ๋ถ€ํ„ฐ ๋งˆ์šฐ์Šค ๋ฐฉํ–ฅ์œผ๋กœ ์ญˆ--์šฑ ๋ป—์–ด๋‚˜๊ฐ„ ์œ„์น˜"๊ฐ€ ๋จ





๋งˆ์ง€๋ง‰ ๊ฒฐ์ •์ ์œผ๋กœ A์—์„œ๋ถ€ํ„ฐ ๊ทธ ์œ„์น˜๊นŒ์ง€ LineTrace๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์ฒซ ๋ฒˆ์งธ๋กœ ๋ฌด์–ธ๊ฐ€์™€ ์ถฉ๋Œํ•˜๋Š” ์œ„์น˜๊ฐ€ย 


ํ”Œ๋ ˆ์ด์–ด ์‹œ์ ์—์„œ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๋ฅผ ๋‘๊ณ  ์žˆ๋Š” ์œ„์น˜์™€ ์™„๋ฒฝํžˆ ๊ฐ™์€ ๊ฑฐ์ž„


์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์นด๋ฉ”๋ผ์˜ ๊ฐ€์žฅ์ž๋ฆฌ ์™œ๊ณก๊ณผ๋„ ์ƒ๊ด€์—†์ด ํ•ญ์ƒ ๊ฑฐ์˜ ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ







<GetSnappedLocation>


์—ฌ๊ธฐ์„œ๋Š” ๋ฒกํ„ฐ ์ขŒํ‘œ๊ฐ’์„ ๋ฐ›์•„์„œ ๊ทธ๋ฆฌ๋“œ ์‚ฌ์ด์ฆˆ๋กœ ๋‚˜๋ˆ ์ฃผ๊ณ , ์ด๊ฑธ ๋ฐ˜์˜ฌ๋ฆผํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋“œ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ณฑํ•ด์คŒ


์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ทธ๋ฆฌ๋“œย origin ์ขŒํ‘œ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ


์˜ˆ)๊ทธ๋ฆฌ๋“œ ํฌ๊ธฐ 100, ์ž…๋ ฅ์ขŒํ‘œ 840ย 

=> 840/100 = 8.4ย 

=>๋ฐ˜์˜ฌ๋ฆผ(๋‚ด๋ฆผ) = 8

=> 8 * 100

= 800

์ด๊ฒŒ 3์ฐจ์›์œผ๋กœ ํ™•์žฅ๋œ๊ฑฐ๋ผ ๋ณด๋ฉด๋จ


๊ทธ๋ฆฌ๋“œ ์‚ฌ์ด์ฆˆ์˜ -2๋ฐฐ๋งŒํผ XY์— ๋”ํ•ด์ฃผ๋Š”๊ฑด ์œ„์น˜ ๋ณด์ •๋ชฉ์ ์ž„


๊ทธ ์™ธ์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์œ ์ €์˜ ์ž…๋ ฅ์œผ๋กœ ๋†’์ด๊ฐ’์— ์˜คํ”„์…‹์„ ๋”ํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋ถ„๊ธฐ๋ฅผ ๋”ฐ๋กœ ๋„ฃ์–ด์คŒ. ๋นŒ๋“œ๋ชจ๋“œ์šฉ์ž„








<BuildSpawnEvent>


์ œ์ผ ์œ„์— ์žˆ๋Š” BuildSpawnEvent๋Š” ์ตœ์ดˆ์— ํ•œ๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉฐ HUD๋กœ๋ถ€ํ„ฐ ์•„์ดํ…œDB์ƒ์— ์ง€์ •๋œ ๋ฉ”์‰ฌ๊ฐ’์„ ๋ฐ›์•„์˜ด


๊ฑด์ถ•๋ฌผ ํด๋ž˜์Šค์ธ "StructureBluprint"๋ฅผ ๋งˆ์šฐ์Šค๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์œ„์น˜์— ์Šคํฐ์‹œํ‚ค๊ณ 


StructureBluprint ๋‚ด๋ถ€์˜ ๋ฉ”์‰ฌ ๋ณ€๊ฒฝ ํ•จ์ˆ˜์ธ ModifyMesh๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์•Œ๋งž๋Š” ๊ฑด์ถ•๋ฌผ ๋ชจ๋ธ๋กœ ๋ฐ”๊ฟ”์คŒ


๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ํŽธ์ง‘๋ชจ๋“œ์— ์žˆ๋Š” ๋™์•ˆ ์บ๋ฆญํ„ฐ๋‚˜ ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜๊ฐ€๋Š” Line Trace์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝœ๋ฆฌ์ „์„ ๋น„ํ™œ์„ฑํ™”์‹œํ‚ด


๋งˆ์ง€๋ง‰์œผ๋กœ ๋นŒ๋“œ ํŽธ์ง‘ ๋ชจ๋“œ ์—ฌ๋ถ€ ๋ถˆ๋ฆฌ์–ธ์„ true๋กœ ๋ฐ”๊ฟ”์„œ


Tick์—์„œ "BuildModeTick" ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ

(Tick์—์„œ๋Š” ์‹œํ€€์Šค๋ฅผ ์ด์šฉํ•ด์„œ ๋‹จ์ˆœํžˆ boolean ์ฒดํฌ ํ›„ ์ด๋ฒคํŠธ ํ˜ธ์ถœ๋งŒ ๋„ฃ์–ด์คŒ)



<BuildModeTick>


๋นŒ๋“œ๋ชจ๋“œ ํ‹ฑ์œผ๋กœ ํ‹ฑํƒ€์ž„๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” ์ด๋ฒคํŠธ์ž„


์—ฌ๊ธฐ์„œ๋Š” ๋งˆ์šฐ์Šคํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ์œ„์น˜๋ฅผ ๋ฐ›์•„์„œ ๊ทธ๋ฆฌ๋“œ ์ขŒํ‘œ๋ฅผ ๊ตฌํ•ด์ค€ ๋‹ค์Œ(๋†’์ด์˜คํ”„์…‹ ํ™œ์„ฑํ™”)


Spawn์ด๋ฒคํŠธ์—์„œ ์Šคํฐํ•œ ์•กํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ  ๋’ค์— ์„ค๋ช…ํ•  BuildModeRoation๊ฐ’์„ ๋ฐ›์•„์„œ Z์ถ• ํšŒ์ „๊ฐ’์— ๋„ฃ์–ด์คŒ


๊ฑด์ถ•๋ฌผ ๋ชจ๋ธ์ด ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ํšจ๊ณผ์ž„ (๊ฑด์ถ•๋ฌผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ)



<BuildCompleteEvent>


์Šค์ƒท์œผ๋ก  ์•ˆ์ฐ์—ˆ์ง€๋งŒ ๋งˆ์šฐ์Šค ํด๋ฆญ ์ด๋ฒคํŠธ์—๋‹ค ๋ถˆ๋ฆฌ์–ธ ์ฒดํฌ๋ฅผ ๋„ฃ์–ด์„œ


๋นŒ๋“œ ํŽธ์ง‘ ๋ชจ๋“œ bool์ด true์ผ ๊ฒฝ์šฐ ์ด ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋งŒ๋“ฌ


์—ฌ๊ธฐ์„œ๋Š” ์šฐ์„  ๋นŒ๋“œ ํŽธ์ง‘ ๋ชจ๋“œ bool์„ false๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๋ฐฉ๊ธˆ ์„ค์น˜ํ•œ ๊ฑด์ถ•๋ฌผ์˜ ์ฝœ๋ฆฌ์ „์„ ํ™œ์„ฑํ™”์‹œ์ผœ์ค€ ๋‹ค์Œย 


ํŽธ์ง‘์ค‘์ธ ์•กํ„ฐ์™€ ๋ฉ”์‰ฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋น„์›Œ์คŒ (์ค‘๊ฐ„์— ModifyMesh ํ•œ๋ฒˆ ๋” ๋“ค์–ด๊ฐ€์žˆ๋Š”๊ฑด ๋””๋ฒ„๊ทธ๊ณผ์ •์— ๋„ฃ์—ˆ๋‹ค ๊นœ๋นกํ•˜๊ณ  ์•ˆ๋บ€๊ฑฐ์ž„)





<Q,E ์ž…๋ ฅ ์ด๋ฒคํŠธ>


๊ฐ„๋‹จํ•จ ๋นŒ๋“œ๋ชจ๋“œ์ผ ๊ฒฝ์šฐ BuildModeRoation๊ฐ’์— 90๋„๋ฅผ ๋”ํ•ด์ฃผ๊ฑฐ๋‚˜ ๋นผ์คŒ


ํ‰์†Œ์—๋Š” ๋ฌด๊ธฐ ๋ฐ”๊พธ๋Š” ํ‚ค๋กœ ์‚ฌ์šฉ๋จ





<๋งˆ์šฐ์Šค ํœ  ์ถ• ์ด๋ฒคํŠธ>


๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ„๋‹จํ•จ ๋นŒ๋“œ๋ชจ๋“œ์ผ ๋•Œ ํœ  ์ถ• ์ž…๋ ฅ๊ฐ’์„ BuildModeZOffset์— ๋”ํ•ด์คŒ(GetSnappedLocation ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋จ)


ํ‰์†Œ์—” ์นด๋ฉ”๋ผ ๊ฑฐ๋ฆฌ ์กฐ์ ˆ์šฉ์œผ๋กœ ์‚ฌ์šฉ๋จ





์˜์ƒ์—์„œ๋Š” ๋ณด๋ฉดย ์•„์งย ์ง‘ ์•ˆ์— ๋“ค์–ด๊ฐ€๋„ ์œ—์ธต์ด ์ˆจ๊ฒจ์ง€์ง€ ์•Š๋Š”๋ฐ


์ด์œ ๋Š” ์•„์ง ์–ด๋–ป๊ฒŒํ• ์ง€ ๊ณ ๋ฏผ์ค‘์ด๋ผ์„œ ๊ทธ๋Ÿผ


์ง€๊ธˆ๊นŒ์ง€ ์ƒ๊ฐ๋‚œ๊ฑด ๊ฒŒ์ž„๋ชจ๋“œ ํด๋ž˜์Šค ๋‚ด๋ถ€์— 2์ฐจ์› ๋ฐฐ์—ด์„ ๋„ฃ๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์ธต ๋ ˆ๋ฒจ(๋ช‡์ธต์— ์„ค์น˜๋ฌ๋Š”์ง€)๋กœ ํ™œ์šฉํ•ด์„œ


ํ”Œ๋ ˆ์ด์–ด ์ขŒํ‘œ์˜ ์ธต ๋ ˆ๋ฒจ๋ณด๋‹ค ์œ„์— ์žˆ๋Š” ๊ฑด์ถ•๋ฌผ ์•กํ„ฐ๋ฅผ ๋ชจ๋‘ ์ˆจ๊น€์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ๋ฐ


์•„์ง ํ™•์‹ ์ด ์•ˆ์„ฌ.. ํผํฌ๋จผ์Šค ๋ฌธ์ œ๋„ ์žˆ์„๊ฒƒ๊ฐ™๊ณ  ์ด๋Ÿฐ์ƒํ™ฉ์ด ์˜ฌ๊นŒ๋ด ์กธ์—…์ „์— ๋“ฃ๊ธด ํ•ด์•ผ๋ ๊ฑฐ๊ฐ™์•„์„œ


์ปด๊ณต๊ณผ๋ชฉ์ค‘์— ๋ฐ์ดํ„ฐ๊ตฌ์กฐ ์ˆ˜๊ฐ•์‹ ์ฒญํ•ด์„œ ๋“ฃ๊ณ ์žˆ์—ˆ๋Š”๋ฐ ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•ด์•ผ๋ ๋“ฏ