Unity

유니티 ScreenToWorldPoint 사용 하는 방법

ITSkeleton 2016. 10. 4. 16:54
728x90
반응형

안녕하세요

ITSkeleton 입니다.


오늘은

WorldToScreenPoint

라는 

Camera.main 함수를 사용해 볼건데요.


생각보다 까다로운 녀석입니다.


잘따라 오신다면

어렵지 않게 사용하실 수 있어요.


예제를 들어서 코드를 작성해 볼건데요


예제는 하나의 오브젝트를 


화면안의 랜덤한 곳에 출력하기 위해 사용하는 방법입니다.

화면크기가 얼마가 됫던간에 화면안에서 출력하는 방법이지요.


자. 이제 시작하겟습니다.


먼저

오브젝트에 대한 월드좌표를 화면좌표로 변경해 줍니다.

Vector3 Spacepos = Camera.main.WorldToScreenPoint(transform.position);


위의 Spacepos에는 오브젝트에 대한 화면좌표 값이 들어가 있습니다.


랜덤하게 나타내겟다고 했죠?

여기서는 벡터를 잘생각해 주셔야합니다.


2D라고 생각한다면 X좌표와 Y좌표만을 사용하죠.

X좌표가 좌,우를 표현할것이고,

Y좌표가 위,아래를 표현할 것입니다.


다른경우라면 다른 방법을 생각해야 겟지요?

저는 위에 적어놓은 것을 배경으로 코드를 작성하겠습니다.

 float createposx = Random.Range(0, Screen.width);


이렇게 적으시면 X좌표 즉, 0~스크린의 넓이 좌표 만큼

랜덤한 수를 반환한뒤 createposx에 넣게 됩니다.

float으로 잡아 놧는데. 화면좌표에는 소수점이 들어가지 않기 때문에

int로 변경해서 사용하셔도 됩니다.


자 이제 화면에대한 x, y, z에 대한 값이 나왔습니다.

이 값들을 적용시켜 주어야 겟지요?

 Vector3 monster = Camera.main.ScreenToWorldPoint(new Vector3(createposx, Screen.height, Spacepos.z));


이렇게 적어주신다면 monster안에는 스크린 좌표를 월드로 다시바꿔서

오브젝트를 생성하게 되면 화면밖으로 나가게 되지 않습니다.

오브젝트에 monster의 position을 넣는다면 말이죠.


여기서! 중요한 점이있습니다.

Z축에 아무것도 넣지 않는다면?

'난 2D게임이라 z축이 필요가 없어'

하면서 z축을 없애고 만든다면

오브젝트는 무조건 카메라의 위치로 옮겨지게 되는 현상을 볼수 있습니다.


아주 중요한문제죠. 

왜그런지는..... 저도....잘.... 하하하하....

위코드로 생성되는 모든 오브젝트가 카메라의 위치로 가게 된다는거죠!

그렇기 때문에 처음에 오브젝트의 위치를 스크린으로 옮겨준것입니다.

WorldToScreenPoint

이것을 사용한 이유입니다.



 GameObject monship = Instantiate(생성할 오브젝트);

            monship.transform.position = monster;


위의 코드는 어떠한 오브젝트를 인스턴스로 만들어서

monster라는 좌표를 적용하는 것입니다.


프로젝트를 하나 만드셔서 실행해보시면 바로 감이오실거라

믿습니다.


한번 실행해 보세요!

728x90
반응형