ย ํ™”๋ฉด๋ฐ–์— ์ ์„ ํ‘œํ˜„ํ•ด๋ณด์ž


์ด๋ ‡๊ฒŒ ๊ธ€์„ ์จ๋ณด๋Š”๊ฑด ์ฒจ์ด๋ผ์„œ ์ž˜ ๋ชป์จ๋„ ์ดํ•ด์ข€ ํ•ด์ค˜ ใ…Žใ…Ž


์ฐธ๊ณ ๋กœ ์ด๊ฑฐ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€์„œ ๊ฒŒ์ž„์— ์“ธ๋งŒํ•˜์ง„๋ชปํ•ดย ๋ณ€ํ˜•์ด ํ•„์š”ํ•ด..


3db4d376abc236a14e81d2b628f17165eeb80e

์ผ๋‹จย ์ธ๋””์ผ€์ดํ„ฐ์˜ ํƒ€๊ฒŸ์ด ๋  ์Šคํ”„๋ผ์ดํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด์คฌ์–ด




3db4d377abc236a14e81d2b628f1776d9b5be7

์ด์ œ ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์ธ๋””์ผ€์ดํ„ฐ๊ฐ€๋  UI๋ฅผ ๋งŒ๋“ค์–ด์ค˜

์ธ์ŠคํŽ™ํ„ฐ์ฐฝ์„ ๋ณด๋ฉด


Monster - ์ธ๋””์ผ€์ดํ„ฐ ํƒ€๊ฒŸ์ด ๋  ์Šคํ”„๋ผ์ดํŠธ ์˜ค๋ธŒ์ ํŠธ

Indicator - ๋นˆ ์˜ค๋ธŒ์ ํŠธ (๊ป๋‹คํ‚ค๊ธฐ์šฉ)

Circle - ํšŒ์ „์‹œํ‚ฌ ์˜ค๋ธŒ์ ํŠธ

UnitImage - ์ธ๋””์ผ€์ดํ„ฐ์— ํ‘œ์‹œ๋  ์œ ๋‹› ์ด๋ฏธ์ง€


์š”๋Ÿฐ ๊ตฌ์กฐ์•ผ



์ด์ œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์ž

OffScreenIndicator.cs ๋ผ๊ณ  ๋‚˜๋Š” ์ด๋ฆ„์„ ์ง€์—ˆ์–ด



Transform indicator; <- ํšŒ์ „์‹œํ‚ฌ ์ธ๋””์ผ€์ดํ„ฐ UI

SpriteRenderer target; <-์šฐ๋ฆฌ ์Šคํ”„๋ผ์ดํŠธ ์˜ค๋ธŒ์ ํŠธ์— ์žˆ๋Š” ๋ Œ๋”๋Ÿฌ

float borderSize; <- ๋ชจ์„œ๋ฆฌ์—์„œ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ง€๊ฒŒ ํ• ๊ฑด์ง€


์ด๋Ÿฐ์‹์œผ๋กœ ๋ณ€์ˆ˜๋„ ์ ์–ด์ฃผ๊ณ 


์ผ๋‹จ ๋‚˜๋Š” ๋ณด์—ฌ์ฃผ๊ธฐ ์šฉ์ด๋‹ˆ๊น ๊ทธ๋ƒฅ ๋‹ค public์œผ๋กœ ์„ ์–ธํ• ๊ฒŒ


CheckOffScreen์ด๋ฆ„์œผ๋กœย ํ•จ์ˆ˜๋„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ๊ณ 


ย  ย  private void CheckOffScreen()

ย  ย  {

ย  ย  ย  ย  //๋ Œ๋”๋Ÿฌ๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด๋ฉด UI๊บผ์ฃผ๊ณ  ๋ฆฌํ„ด

ย  ย  ย  ย  if (target.isVisible)

ย  ย  ย  ย  {

ย  ย  ย  ย  ย  ย  indicator.parent.gameObject.SetActive(false);

ย  ย  ย  ย  ย  ย  return;

ย  ย  ย  ย  }


ย  ย  ย  ย  //๋ Œ๋”๋Ÿฌ๊ฐ€ ํ™”๋ฉด์— ์•ˆ๋ณด์ผ์‹œ UI์ผœ์ฃผ๊ธฐ

ย  ย  ย  ย  indicator.parent.gameObject.SetActive(true);


ย  ย  ย  ย  //์บ”๋ฒ„์Šค UI์— ์œ„์น˜๋ฅผ ์˜ฎ๊ธฐ๊ณ  ํšŒ์ „ํ• ๊ฑฐ๋‹ˆ๊น ์šฐ๋ฆฌ ํƒ€๊ฒŸ์˜ ์ขŒํ‘œ๋ฅผ ์Šคํฌ๋ฆฐ์ขŒํ‘œ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

ย  ย  ย  ย  Vector3 viewPo = Camera.main.WorldToScreenPoint(transform.position);

ย  ย  ย  ย  //UI ์œ„์น˜ ์ €์žฅ์šฉ ๋ฒกํ„ฐ ์„ ์–ธ

ย  ย  ย  ย  Vector3 movePo = viewPo;

ย  ย  ย  ย  //ํ™”๋ฉด ์ค‘์•™์  ์ขŒํ‘œ ์„ ์–ธ

ย  ย  ย  ย  Vector2 center = new Vector2(Screen.width / 2.0f, Screen.height / 2.0f);


ย  ย  ย  ย  //Atan2 ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํƒ€๊ฒŸ๊ณผ ์ค‘์•™ ์‚ฌ์ด์— ๊ฐ๋„๋ฅผ ๊ตฌํ•จ

ย  ย  ย  ย  float angle = Mathf.Atan2(viewPo.y - center.y, viewPo.x - center.x);


ย  ย  ย  ย  //ํšŒ์ „์‹œํ‚ฌ ์ธ๋””์ผ€์ดํ„ฐUI ํ˜„์žฌ ๊ฐ๋„๋ฅผ ์ €์žฅ

ย  ย  ย  ย  Vector3 indicatorAngle = indicator.rotation.eulerAngles;


ย  ย  ย  ย  //UIํšŒ์ „๊ฐ๋„ ๊ฐ’ ํ• ๋‹น, Mathf.Rad2Deg ๊ณฑํ•˜๋Š” ์ด์œ ๋Š” (Atan2 ํ•จ์ˆ˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์ด ๋ผ๋””์•ˆ ์ด๋ผ์„œ ๊ฐ๋„๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ์šฉ)

ย  ย  ย  ย  indicatorAngle.z = angle * Mathf.Rad2Deg;


ย  ย  ย  ย  //UI ํšŒ์ „ ์ ์šฉ

ย  ย  ย  ย  indicator.rotation = Quaternion.Euler(indicatorAngle);


ย  ย  ย  ย  //Mathf.Cos(๋ผ๋””์•ˆ) -> -1 ~ 1 ๊ฐ’์„ ์ถœ๋ ฅ, x๊ธธ์ด

ย  ย  ย  ย  float xSize = Mathf.Cos(angle) * center.x;

ย  ย  ย  ย  //Mathf.Sin(๋ผ๋””์•ˆ) -> -1 ~ 1 ๊ฐ’์„ ์ถœ๋ ฅ, y๊ธธ์ด

ย  ย  ย  ย  float ySize = Mathf.Sin(angle) * center.y;


ย  ย 

ย  ย  ย  ย  movePo.x = Mathf.Clamp(xSize + center.x, borderSize, Screen.width - borderSize);

ย  ย  ย  ย  movePo.y = Mathf.Clamp(ySize + center.y, borderSize, Screen.height - borderSize);

ย  ย  ย  ย  movePo.z = 0;


ย  ย  ย  ย  indicator.parent.transform.position = movePo;

ย  ย  }


์ด์ œ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜์— ์ ์šฉํ•ด์ฃผ๊ณ 


๋ชฌ์Šคํ„ฐ ์Šคํ”„๋ผ์ดํŠธ ์˜ค๋ธŒ์ ํŠธ์— ๋‹ฌ์•„์ฃผ๊ณ 



3db4d374abc236a14e81d2b628f175685303fa


๋ณ€์ˆ˜ ํ• ๋‹นํ•ด์ฃผ๊ณ !


์‹คํ–‰ํ•˜๋ฉด



04b3d42fe6d32ca97c8dd3a603dd3073a671b01527abc36c797b2a28970692


์š”๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜จ๋‹ค!


๊ฒŒ์ž„์— ์“ธ๋ ค๋ฉด ๋ณ€ํ˜•์ด ํ•„์š”ํ•˜์ง€๋งŒ ํ˜น์‹œ๋‚˜ ์ฐธ๊ณ ํ• ์‚ฌ๋žŒ์žˆ์œผ๋ฉด ์ฐธ๊ณ ํ•˜๋ผ๊ณ  ์˜ฌ๋ ค๋ดค์–ด!!