Game Development, 게임개발/개발

마우스 입력 받아서 이용하는 4가지 방법[Unity]

게임이 더 좋아 2021. 4. 10. 00:54
반응형
728x170

 

마우스는 스크린에 있지만

이용하려면 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 만큼 떨어진 지점을 반환한다.

 

 

 

 


참고 링크

www.youtube.com/watch?v=RGjojuhuk_s

728x90
반응형
그리드형