24b0d121e09c28a8699fe8b115ef046546adfe




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();


๊ทธ๋žฌ๋”๋‹ˆ ๊ฒฐ๊ณผ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ด


24b0d121e09c28a8699fe8b115ef046a786aef


๋‚ด๊ฐ€ ์‹์„ ์ž˜๋ชป์ง ๊ฑด๊ฐ€ ์‹ถ์€๋ฐ ์•„๋ฌด๋ฆฌ ๋จธ๋ฆฌ ๊ตด๋ ค๋ณด๊ณ  ํšŒ์‚ฌ ๋‹ค๋‹ˆ๋Š” ์• ๋“ค ๋ถˆ๋Ÿฌ๋‹ค๊ฐ€ ๊ฐ™์ด ์ฝ”๋“œ ๋ด๋„ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์ „ํ˜€ ๋ชจ๋ฅด๊ฒ ๋”๋ผ

๋ญ๊ฐ€ ๋ฌธ์ œ์ผ๊นŒ ๋Œ€์ฒด