TPS ๊ฒ์ ๋ง๋๋๋ฐ ํฌ๋ก์คํค์ด๋ฅผ ์ํ์ผ๋ก ๋ง๋ค๊ณ ๊ทธ ์ ๋ด๋ถ์์ ๋ฌด์์ ์์น์ ์ด์์ด ๋ ์๊ฐ๊ฒ ๋ง๋ค์ด์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์๋ก ์ ํ๋๊ฐ ๋ฎ์์ง๊ฒ ๋ง๋ค๋ ค๊ณ ํ๋ ์ค์ธ๋ฐ
์ฃผ์ด์ง๋ ๋ณ์๋ ์ต๋์ฌ๊ฑฐ๋ฆฌ์ ์ต๋์ฌ๊ฑฐ๋ฆฌ์์์ ์์ ๋ฐ์ง๋ฆ์
๊ทธ๋ฌ๋ฉด ์ด์์ ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์๋ฟํ์ ๋ฒ์ ๋ด์์ ๋ฌด์์๋ก ๋ ์๊ฐ๋๊ฑฐ๊ณ
์ผ๋จ ์ฒซ๋ฒ์งธ๋ก ์ต๋์ฌ๊ฑฐ๋ฆฌ์ ์์ ๋ฐ์ง๋ฆ์ ์ด์ฉํด์ UI๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์ด๋ ๊ฒ ํ์
FVector Center = ์ด๊ตฌ๋ฒกํฐ + (์ด๊ตฌ์ forward ๋ฒกํฐ * Distance);
FVector Corner = Center + (์ด๊ตฌ์ right ๋ฒกํฐ * Radius);
float CrosshairRadius = (WorldToScreen(Corner) - WorldToScreen(Center)).Size();
Crosshair.SetSize(FVector2D(CrosshairRadius * 2));
์ด๋ ๊ฒ ํ๋๊น ์ํ ํฌ๋ก์คํค์ด๊ฐ ๋์ด
์ด ํ์ ์ด์ ๋ฐ์ฌ๋ ์ด๋ ๊ฒ ๋ง๋ฌ
float RotationAngle = FMath::RandRange(-3.14f, 3.14f);
FVector RandomPlace = Center + (์ด๊ตฌ์ up ๋ฒกํฐ * FMath::Sin(RotationAngle) + ์ด๊ตฌ์ right ๋ฒกํฐ * FMath::Cos(RotationAngle)) * (Corner - Center).Size();
๊ทธ๋ฌ๋๋ ๊ฒฐ๊ณผ๊ฐ ์ด๋ ๊ฒ ๋์ด
๋ด๊ฐ ์์ ์๋ชป์ง ๊ฑด๊ฐ ์ถ์๋ฐ ์๋ฌด๋ฆฌ ๋จธ๋ฆฌ ๊ตด๋ ค๋ณด๊ณ ํ์ฌ ๋ค๋๋ ์ ๋ค ๋ถ๋ฌ๋ค๊ฐ ๊ฐ์ด ์ฝ๋ ๋ด๋ ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง ์ ํ ๋ชจ๋ฅด๊ฒ ๋๋ผ
๋ญ๊ฐ ๋ฌธ์ ์ผ๊น ๋์ฒด
์ฝ๋๊ฐ ๋ง๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋๋ฐ.. ๊ทธ์ ์ ๋ณ์๋ฅผ ๊ทธ๋ฅ ๊ฐ๋ ๋ฒ์ ํ๋๋ก ํ๋๊ฒ ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ๊ตฌํ์ ์ผ๋ก๋ ๋ง์ง ์์๊น?
๊ฐ๋๋ฅผ ์ฐ๋ ๋ฐ์ง๋ฆ์ ์ฐ๋ ๋ ๋๊ฐ๋ค๊ณ ์๊ฐํ๋๋ฐ ์๋๊ฐ...
๋ฐ์ง๋ฆ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๊ฐ๋๋ฅผ ๊ตฌํ ์ ์๊ณ ๊ฐ๋๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋ฐ์ง๋ฆ์ ๊ตฌํ ์ ์์ผ๋๊น ๊ฒฐ๊ตญ ์ฃผ์ด์ง๋ ๋ณ์๋ง ๋ค๋ฅธ๊ฑฐ ์๋์ผ?
Crosshair์ SetSizeํจ์๊ฐ FVector2D๊ฐ์ ๋ฐ์๋ FVector2D์ ๊ธธ์ด๊ฐ์ ๋ฐ๊ณ ์์ ํน์?
FVector2D์ ์ด๊ธฐ๊ฐ์ ํ๋๋ง ๋ฃ์ผ๋ฉด ํน์ x y ๋๋ค์ ์ด๊ธฐ๊ฐ ์ค์ ๋์ง์์?
๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด FVector2D์ x๊ฐ์ 0๋ฅผ ๋ฃ๋ y๊ฐ์ 0๋ฅผ ๋ฃ๋ ํ๋ฉด ํด๊ฒฐ๋ ๊ฑฐ๊ฐ์๋ฐ
์ ์๋๊ฐ ํฌ๋ก์คํค์ด๊ฐ ๋ ์์์งํ ๋ฐ ๊ทธ๋ผ
SetSize ํจ์๊ฐ UI Width, Height ๋ฐ์์ ํฌ๊ธฐ ์ค์ ํด์ฃผ๋ ํจ์๋ผ์ ๋์ค ํ๋์ 0์ ๋ฃ์ผ๋ฉด UI ์๋ณด์ผ๊ฑธ?
๊ทผ๋ฐ ๋ ๊ถ๊ธํ๊ฒ ์ ๋ฌ๋ฉด ์ด๊ตฌ์ ์์ง์ธ ๋ฒฝ์ด์๋๋ผ ์กฐ๊ธ ์๋ฑํ ๋ฒฝ์ผ๋๋ ์ด์์ด ์ด๋ป๊ฒ ๋ฐํ๋๊ฑฐ์?
์ ์ด์ฐจํผ ์ด๊ตฌ์์ ๋ผ์ธํธ๋ ์ด์ค ์ ๋ํฐ๋ก ๋ฐ์ง๋ฉด ๋ ์ด ๋๊ฐ๋๊ฑฐ๋ผ ๊ทธ๋ฅ ์๋ฒ์๋ก ๋๊ฐ๊ฑธ? ๋๊ฐ์ด
๊ทธ๋ผ ๊ฑฐ์ ํ๋ ์ด์ด๊ฐ ๋ฒฝ์ด๋ ๋ฑ๋ถ์ด์ ธ์๊ณ ๋ฒฝ๊ณผ ๊ฑฐ์ ์ํ์ธ์ํ์์ ์ด๊ตฌ๊ฐ ์ํ์ธ ๋ฒฝ์ ๋จผ ๊ณณ์ ๋ฐ๋ผ๋ณด๊ณ ์์ผ๋ฉด ์ด์ ํ๋๊ฒ ์๊ฐ๋ณด๋ค ์กฐ๊ธ ํฐ ์ ๋ฒ์๋ก ํ์ง์์?
๊ทธ๋ฐ๊ฐ... ๋ ์๋๊ฑฐ๊ฐ์๋ฐ ์ผ๋จ์ ๊ทผ๋ฐ ๊ฑฐ๋ฆฌ์ ๋ฒฝ๊ณผ์ ๊ฐ๋๊ฐ ์ด๋ป๋ ํญ์ ์ ๋ ๊ฒ๋์ด
์ ์ ์ ์ฅ์์ ๋ง์. ์ ์ด ์ด๊ตฌ์ชฝ์ ์๋๋ฐ ๊ทผ์ ํ ์ํฉ์ด๋ฉด ๋จผ ๋ฒฝ๋ณด๊ณ ์ด๋ ์ผ์ ํ๋ฅ ๋ก๋ ๋ง๋๋ค๋์๊ธฐ์์
๋นก๋๊ฐ๋ฆฌ๋ผ ๋ฌด์จ ๋ป์ธ์ง ์ดํด๊ฐ ์ ์๋๋ค ใ ใ ใ
์ด๊ตฌ ๋ฐฉํฅ๊ณผ ์นด๋ฉ๋ผ ๋ฃฉ๋ฒกํฐ ๋ฐฉํฅ์ด ์ผ์นํ์ง ์์ผ๋ฉด crosshairradius๊ฐ ๋๊ฐ ์๊ฐํ๋ ๊ฒ๋ณด๋ค ์์ ๊ฐ์ด ๋์ค๋๊น ๊ทธ๋ฐ๋ฏ
์์ง ์ด๊ตฌ ์๋ฃ๊ณ ์์๋ก ์นด๋ฉ๋ผ๋ถํฐ ์๋๊ฑฐ๋ผ ใ ใ ;
์ดํดํ๊ธฐ ์ฝ๊ฒ ๊ณผ์ฅํด์ ์๋ฅผ ๋ค์๋ฉด. ์ด๊ตฌ๊ฐ left ์ถ ๋ฐฉํฅ์ด ๋์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด ๋ ์์์ worldtoscreen(corner)๋ worldtoscreen(center)๋ ๊ฐ์๊ฑธ?
์ ์นด๋ฉ๋ผ์์ ์๋๊ฑด๋ฐ ์ ๋ฐ๋ค๊ณ ใทใท
ใ ใ ใ ใ ใ ใ
์ ๋ญ์ง ์์๋ค ์ ์ผ ์๋ ์์ด ์๋ชป๋์๋
๋ชจ๋ฐ์ผ๋ก ์ฐ๊ธฐ ๋๋ฌด๊ท์ฐฎ๋ค
์ ์ผ ์๋ ์์ด ์๋ชป๋๋ค๊ณ ?
์ ๋ฏธ์ ํ๋ค๋ฆฌ์ง์๋๋ด ์ข๋ ๋ด๋ณผ๊ฒ ใ
ใ ใ ๊ทธ๋๋ ๋์์ค์ ๊ณ ๋ง๋ค
์๋ง๋ด๋ ๋ง์ง๋ง ์์ด ๋ฌธ์ ๊ฐ ๋ง๋๊ฑฐ๊ฐ์๋ฐ.
FVector RandomPlace = Center + (FMath::Sin(RotationAngle), FMath::Cos(RotationAngle), 0) * (Corner - Center).Size(); ๋ก ํด๋ณผ๋?
๋ง์ง๋ง ์์ด ์ ๋๋ก ๋์ํ๋ ค๋ฉด right 1,0,0 up 0,1,0 ์์ด ๋ณด์ฅ๋์ด์ผ ํ๋๋ฐ ์ฌ๊ธฐ์ ์ด๊ธ๋ฌ์๊ฑฐ๊ฐ์ ๋๋์ด
(FMath::Sin(RotationAngle), FMath::Cos(RotationAngle), 0) ์ด๋ถ๋ถ์ด ๋ฒกํฐ ๋ง์ง? ์ด๋ฌ๋ฉด Z ๊ฐ์ด 0 ๊ณ ์ ์ด๋ผ ๊ฒฐ๊ณผ๊ฐ ํน์ ๊ฐ๋์์๋ง ์ํ์ผ๋ก ๋์ค๊ณ ๋ค๋ฅธ ๊ฐ๋์์ ์ง์ ๋ชจ์์ผ๋ก ๋์ด ๊ทธ๋ฆฌ๊ณ ๊ทธ ํน์ ๊ฐ๋์์๋ ํฌ๋ก์คํค์ด๋ฅผ ๋ฒ์ด๋๋ค;; ํฌ๋ก์คํค์ด๊ฐ ์๋ชป๋๊ฑด๊ฐ?
z์ถ๊น์ง ๊ณ ๋ คํด์ผ ํ๋ ์ํฉ์ด๋ฉด ๋งํธํ๊ฒ rotation ํจ์๋ฅผ ์ฐ๋๊ฒ ๋์๋ฏ.
๊ทผ๋ฐ ์ด ๋ฐฉ๋ฒ๋ ๊ทธ๋ ๊ณ ๋ค๋ฅธ์ ๋ค์ด ์๋ ค์ค ๋ฐฉ๋ฒ๋ ๊ฒฐ๊ตญ ํฌ๋ก์คํค์ด๋ณด๋ค ๋์ ๋ฒ์์ ํ์ฐฉ๊ตฐ์ด ํ์ฑ๋๋๊ฑฐ ๋ณด๋ ์ฌ๊ฒฉ์ ๋ฌธ์ ๊ฐ ์๊ณ ํฌ๋ก์คํค์ด ํฌ๊ธฐ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ชป๋ ๊ฒ ๊ฐ์
์ ๊ฑฐ ๋ณด๋๊น ๋ง์ง๋ง์ ๊ดํธ๊ฐ ์ ๋ฒกํฐ ์์ ๊ดํธ ๋ ํด์ผํ ๊ฑฐ๊ฐ์๋ฐ
์ Sin ์ค๋ฅธ์ชฝ? ๊ทธ๊ฑฐ๋ ๋ด๊ฐ ๊ธ์ฐ๋ค๊ฐ ์๋ชปํ๋ฏ ์ค์ ์ฝ๋์์ ์๊ทธ๋
FVector RandomPlace = Center + (์ด๊ตฌ์ up ๋ฒกํฐ * FMath::Sin(RotationAngle) + ์ด๊ตฌ์ right ๋ฒกํฐ * FMath::Cos(RotationAngle)) * (Corner - Center).Size(); ์ด๋ ๊ฒ ๋ผ์๋ค๋๊ฑฐ?
ใดใด ๋ด๊ฐ ๊ธ ์์ ํ์ ์ง๊ธ ๊ธ์ ์๋๋๋ก๊ฐ ๋ง์
์ ์์ง๋ ํ๋ ธ๋ค ๋ค์ ์์ ํจ
ใ ใน๊ฒ ๋๋ฐ ๊ทธ๋ผ.. Radius๊ฐ์ด๋ (Corner-Center).Size()๊ฐ์ด ๋์ผํ์ง ํ์ธ ํด๋ด์ผํ ๋ฏ
๋์ผํ๋๋ผ
๊ทผ๋ฐ ์ด๊ฑด ๋ณ๊ฐ์๊ธด๋ฐ ์ ์๋๋ก๋ฉด ์ ๋ด๋ก ์๋๊ฒ์๋๋ผ ์๊ฐ์ฅ์๋ฆฌ์๋ง ๋ฐํ๊ฑฐ๊ฐ๋ค
ใ ใ ํฌ๋ก์คํค์ด๋ ๋ง์ถ๋ ค๊ณ ์ผ๋ถ๋ฌ ๋๋ค ์๋ฃ๊ณ ์ต๋๋ฒ์๋ง ๋ฐํ๊ฒํจ
float RotationAngle = FMath::RandRange(-180.f, 180f); FVector RandomPlace = Center + (์ด๊ตฌ์RightVector().RotateAngleAxis(RotationAngle, ์ด๊ตฌ์ Forward๋ฒกํฐ()) * Radius);
์ด๊ตฌ์ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ์ด๊ตฌ์ Right ๋ฒกํฐ๋ฅผ ํ์ ์ํด.(์ ํจ์๋ degree ๋จ์๋ก ํ์ ๊ฐ์ ๋ฐ์)
์ด๊ฑฐ๋ ๋ด๊ฐ ์ฌ๋ฆฐ ์์ด๋ ๊ฒฐ๊ณผ๋ ๊ฐ๊ฒ๋์ค๋๋ฐ ๊ทธ๋ฌ๋ฉด ํฌ๋ก์คํค์ด ํฌ๊ธฐ ๊ตฌํ๋ ์์ด ์๋ชป๋๊ฑด๊ฐ
TPS ๋ฉด ์ด๊ตฌ ์์ ์ด๋ ์นด๋ฉ๋ผ์ ์์ ์ด ๋ค๋ฅด๋๊น ์ด๊ตฌ ๊ธฐ์ค ์์ด ์นด๋ฉ๋ผ์์๋ ํ์์ผ๋ก ์ฐ๊ทธ๋ฌ์ ธ์ ๋ณด์ด์ง ์๋? ๊ทธ๋์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ค๊ณ ๋๋ผ๋๊ฒ ์๋๊น? ์ค์ ํ์ฐฉ๊ตฐ์ด ์ ๋ ๊ฒ ์ ํํ ์ํ์ผ๋ก ๋ณด์?
์ผ๋จ ๋จผ์ ๋ง๋ค๊ณ ๋์ค์ ์ฎ๊ธฐ๋ ค๊ณ ์ง๊ธ์ ์ด๊ตฌ๊ฐ ์๋๋ผ ์นด๋ฉ๋ผ์์๋ถํฐ ์ด์์ด ๋๊ฐ๊ฒ ๋ง๋ค๊ณ ํ ์คํธ์ค์
๊ทธ๋ฆฌ๊ณ ์ด๊ตฌ๊ฐ ์ถ๊ฐ๋์ด๋ ๊ฒฐ๊ตญ ํฌ๋ก์คํค์ด๋ ์คํฌ๋ฆฐ์์ ์์นํ๋๊น ๋ผ์ธ ํธ๋ ์ด์ค์ ์ถ๋ฐ ์ง์ ๋ง ๋ฐ๋๊ณ ํ์ฐฉ๊ตฐ์ ์ง๊ธ์ฒ๋ผ ์ํ์ผ๋ฏ
์๋๋ฉด ์ด๊ตฌ์์ ๋๊ฐ๋์ง ์๋์ง ์ ๋ฌด๊ฐ ํฌ๊ฒ ์ค์ํ์ง ์์์ ๊ธฐํ์๋ ํฉ์๋ณด๊ณ ๋์ค์ ๊ทธ๋ฅ ์นด๋ฉ๋ผ์์ ๋๊ฐ๊ฒ ํ ์๋ ์์ ๊ฒ ๊ฐ๊ณ
ํฌ๋ก์คํค์ด๋ฅผ ์นด๋ฉ๋ผ ๊ธฐ์ค์ด ์๋๋ผ ์ด๊ตฌ ๊ธฐ์ค์ผ๋ก ๋ฐ๊ฟ์ ํ ์คํธ ํด๋ณด๋ฉด ์ข์ ๊ฑฐ ๊ฐ์๋ฐ
์ ํฌ๋ก์คํค์ด๊ฐ ์ํ ์ด๋ฏธ์ง ๋ผ๋ฉด ์ ๊ทธ๋ฆผ์ด ์๋ ์ฌ์ด์ฆ๋ ์ผ์น๋ฅผ ์ํ๋๊ฒ ์๋๊น?
ํ ๋ชจ๋ฅด๊ฒ ๋ค
๊ทธ๋ฆผ์ ๋ด๊ฐ ์์๋ก ์์ ๊ทธ๋ ค๋ฃ์๊ฑฐ๊ธด ํ๋ฐ ๋ชจ์๋ฆฌ์ ์์ ํ ๋ฟ๋ ์์ด๋ผ ๊ด์ฐฎ์ ๊ฒ ๊ฐ์๋ฐ
๋ง์ฝ umg ๋ก ๊ทธ๋ฆฌ๋ฉด dpi scaling ์ ์ฉ๋๋๊ฒ ์๋๊น?
์ ๊ทธ๊ฒ ์ ๋ต์ด์๋ค ใทใท ui๋ ์ ๋ชฐ๋ผ์ ๊ทธ๋ฅ ์ด๋ฏธ์ง๋ง ๋ฑ ๋ฃ๊ณ ์์๋ก ํด๋์๊ฑฐ์๋๋ฐ ํ์คํฌ๋ฆฐ์ผ๋ก ํ๊ณ ์คํํด๋ณด๋๊น ๋ฑ ๋ง๋ค ใ ใ ใ ใ
๋คํ์ด๋ค~
์ง์ง ๋ ์๋์์ผ๋ฉด ํด๊ฒฐ ๋ชปํ์๋ฏ ใ ใ ๊ณ ๋ง์