마우스는 스크린에 있지만
이용하려면 WorldSpace로 변환하던가.. 무엇인가 해야하는 상황이 있다.
마우스 입력을 받아서 이용하는 방법에 대해 알아보자.
0 번째 방법
Input.mousePosition
얘는 그냥 Screen을 바로 출력해서
해상도가 1920 * 1080이면 오른쪽 위를 클릭하면 (1920,1080)을 반환한다.
본격적으로
첫 번째 방법 ScreenToWorldPoint( )
이 방법은 2D게임이나 3D를 isometric으로 볼 때 많이 쓴다.
** 그 외적으로는 우리가 기대한만큼의 정확성을 기대하기 어렵다.
적어도 x,y를 우리가 스크린에서 조절할 수는 있지만 z에 대해선 마우스로 조절할 수 없는 영역이다.
우리가 저기서 Input.mousePosition에서는 z 성분을 얻을 수 없다.
나는 임의로 z성분에 1을 주었다.
**z성분은 여기서 카메라와의 거리라고 생각하면 된다.
void Update(){
if(Input.GetMouseButtonDown(0)){
// Initializing
Vector3 clickPos = Vector3.one;
//Method - 1
clickPos = Camera.main.ScreenToWorldPoint(Input.mousePosition + Vector3(0,0,1f));
//check
Debug.Log(clickPos);
}
}
다시 말하자면
카메라에 z성분만큼 떨어진 거리에 평면을 놓는다.
유니티는 그 평면이 스크린이라고 생각하게 되고
그 평면의 클릭한 부분을 World Space 값으로 반환하는 것이다.
두 번째 방법 Raycast
++ ScreenPointToRay( )
void Update(){
if(Input.GetMouseButtonDown(0)){
// Initializing
Vector3 clickPos = Vector3.one;
//Method - 2
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit)){
clickPosition = hit.point;
}
//check
Debug.Log(clickPos);
}
}
이렇게 되면 카메라에서 마우스가 입력된 곳을 향해 Ray(빛)을 쏘게 되고
빛(ray)에 대해 Collider와 충돌(hit)이 일어나면 해당 충돌 지점의 좌표를 반환하는 것이다.
**hit에는 많은 정보들이 포함되어 있다.
여기서 더 응용을 하자면
Raycast에는 LayerMask 라는 요소가 들어있다.
그래서 이용하자면 해당 Layer만 충돌 하는 것이다.
아주 유용하게 쓰인다.
...
public LayerMask clickMask;
void Update(){
if(Input.GetMouseButtonDown(0)){
// Initializing
Vector3 clickPos = Vector3.one;
//Method - 2
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit, clickMask)){
clickPosition hit.point;
}
//check
Debug.Log(clickPos);
}
}
세 번째 방법도 Raycast를 이용한다.
조금 다르게 Plane을 이용한다.
Ray가 Plane을 통과할 경우 쓰인다.
** 씬엔 보이진 않지만 해당 스크립트에선 평면이 존재하므로 실제로 비어있더라도 해당 지점이 출력된다.
...
void Update(){
if(Input.GetMouseButtonDown(0)){
// Initializing
Vector3 clickPos = Vector3.one;
//Method - 3
Plane plane = new(plane(Vector3.up, 0f);
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float distanceToPlane;
if(plane.Raycast(ray, out distanceToPlane )){
clickPos = ray.GetPoint(distanceToPlane);
}
//check
Debug.Log(clickPos);
}
}
Plane.Raycast 는 out으로 float 형식의 해당 평면과의 거리를 준다.
ray.GetPoint(float distance)는
ray를 따라 distance 만큼 떨어진 지점을 반환한다.
참고 링크
'Game Development, 게임개발 > 개발' 카테고리의 다른 글
카메라 크기에 맞춰서 경계 설정하기, Boundary [Unity] (0) | 2021.04.14 |
---|---|
투사체 경로 흔적 남기기, ProjectileTrail [ Unity] (4) | 2021.04.11 |
Invoke로 인한 문제점 [Unity] (0) | 2021.04.08 |
배경음악 설정하기, 볼륨 조절, 씬이동에도 지속하기 [Unity] (14) | 2021.04.08 |
UI, 유저인터페이스 응용 - 인벤토리 만들기 (0) | 2021.04.07 |