ย ํ๋ฉด๋ฐ์ ์ ์ ํํํด๋ณด์
์ด๋ ๊ฒ ๊ธ์ ์จ๋ณด๋๊ฑด ์ฒจ์ด๋ผ์ ์ ๋ชป์จ๋ ์ดํด์ข ํด์ค ใ ใ
์ฐธ๊ณ ๋ก ์ด๊ฑฐ ๊ทธ๋๋ก ๊ฐ์ ธ๊ฐ์ ๊ฒ์์ ์ธ๋งํ์ง๋ชปํดย ๋ณํ์ด ํ์ํด..
์ผ๋จย ์ธ๋์ผ์ดํฐ์ ํ๊ฒ์ด ๋ ์คํ๋ผ์ดํธ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด์คฌ์ด
์ด์ ์ ์ฌ์ง์ฒ๋ผ ์ธ๋์ผ์ดํฐ๊ฐ๋ 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;
ย ย }
์ด์ ์ ๋ฐ์ดํธ ํจ์์ ์ ์ฉํด์ฃผ๊ณ
๋ชฌ์คํฐ ์คํ๋ผ์ดํธ ์ค๋ธ์ ํธ์ ๋ฌ์์ฃผ๊ณ
๋ณ์ ํ ๋นํด์ฃผ๊ณ !
์คํํ๋ฉด
์๋ฐ ๊ฒฐ๊ณผ๊ฐ์ด ๋์จ๋ค!
๊ฒ์์ ์ธ๋ ค๋ฉด ๋ณํ์ด ํ์ํ์ง๋ง ํน์๋ ์ฐธ๊ณ ํ ์ฌ๋์์ผ๋ฉด ์ฐธ๊ณ ํ๋ผ๊ณ ์ฌ๋ ค๋ดค์ด!!
๋๊ณ ์ใทใท - dc App
์ด๋์ ๋๋ค์์ ์ด๋ณด๋ผ๊ณ ์ ์ผ๋ฉด ์๋ผ ์ด๋ณด๊ฐ ์๋๊ฒ ๋์์๋
coriander - dc App
์ค์ ์งฑ์ก๊ธฐํ๋ค.. - dc App