[Unity] 마우스커서, 락온

이정석·2023년 7월 10일
0

Unity

목록 보기
14/22

마우스커서

화면에 있는 마우스커서가 무엇을 가리키는지에 따라 마우스커서의 아이콘을 변경하고 싶을 때가 있다. 이것을 구현하기 위해서는 다음과 같은 단계를 거쳐야 한다.

  • 마우스커서가 가리키는 GameObject를 찾는다.
  • 현 상황의 GameObject에 맞는 아이콘으로 마우스커서를 바꾼다.

GameObject를 찾는 것은 Raycast를 사용할 것이고 마우스커서를 바꾸는 것은 Unity 내부기능을 사용할 것이다.

1. GameObject 탐색 및 변경

마우스커서는 어떤 GameObject를 가리키는지 모르기 때문에 매 프레임마다 GameObject를 찾고 바꾸어 줘야 한다. 즉, GameObject를 탐색하고 바꾸는 과정은 Update()에 구현한다.

GameObject를 Raycast를 이용해 탐색할 때, Layer를 사용한다. Layer는 커서가 만들어 내는 Ray가 어떤 유형의 GameObject와 부딪히는지를 나타낸다. 예를들면 몬스터나 캐릭터, 아이콘, 버튼과 같은 유형을 나누고 Ray와 부딪힌 GameObject의 Layer에 따라 마우스커서 아이콘을 변경할 수 있다.

    Texture2D _attackIcon = Resource.Load<Texture2D>("Textures/Cursor/Attack");
    int _mask = (1 << (int)Define.Layer.Ground) | (1 << (int)Define.Layer.Monster);
	void UpdateMouseCursor()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, 100.0f, _mask))
        {
            if (hit.collider.gameObject.layer == (int)Define.Layer.Monster)
            {
                Cursor.SetCursor(_attackIcon, new Vector2(_attackIcon.width / 5, 0), CursorMode.Auto);
            }
        }
    }

커서를 변경하는 것은 UnityEngine.Curosr 클래스에서 가능하다. Cursor 클래스의 SetCursor()는 변경할 아이콘, 끝점 좌표, Cursor Mode를 입력받는다.

  • 변경할 아이콘(Texture2D)
  • 끝점 좌표(Vector2D): 실제 클릭이 인식될 아이콘상의 좌표, 왼쪽 위가 (0,0)이다.
  • Cursor Mode: 커서의 동작방식을 나타내며 Auto, ForceSoftwarer가 있다. Unity버전마다 다를것으로 예상된다.

락온

만약 마우스를 누른상태로 다른 UI나 캐릭터로 커서를 옮기면 어떻게 될까? 이벤트를 어떻게 나눴고 구현을 어떻게 했느냐에 따라 다르겠지만 PressClick만 나누었다면 매 프레임마다 이벤트가 인식되어 아이콘이 변경될 것이다.

1. MouseEvent

UnityEngine.Input에서 지원하는 마우스이벤트함수는 총 세가지이다.

  • Input.GetMouseButton(number): 마우스가 눌리고 있을 때 호출되는 함수
  • Input.GetMouseButtonDown(number): 처음 마우스가 눌렸을 때 호출되는 함수
  • Input.GetMouseButtonUp(number): 손가락이 마우스에서 떨어졌을 때 호출되는 함수

위 세가지 함수를 이용해 Click과 같이 Unity에서 지원하지 않는 Action을 구현할 수 있다.

  • 마우스를 누를 때와 손가락이 마우스에서 떨어졌을 때의 시간이 일정 시간보다 적다면 Click 이벤트를 발생시킨다.

시간의 기준은 두 시점의 상대적인 기준이면 된다. Time 클래스를 사용해도 되고 실제 현실의 ms 단위를 사용해도 된다.

2. 락온

락온은 어떻게 정의하느냐에 따라 작동하는 방법이 달라진다.

마우스를 누르고 있는 상태에서,

  • 마우스커서가 클릭한 대상을 벗어나면 작동을 멈춘다.
  • 마우스커서가 클릭한 대상을 벗어나면 새로운 클릭으로 간주한다.
  • 마우스커서가 클릭한 대상을 벗어나도 기존의 동작을 계속한다.

위 세가지 상황에서 가장 구현하기 쉬운 상황은 마지막 상황이다. 구현하는 방법은 간단하다 마우스커서를 변경하고자 할 때, 마우스가 눌린 상태라면 변경을 하지않는 것이다.

    Texture2D _attackIcon = Resource.Load<Texture2D>("Textures/Cursor/Attack");
    int _mask = (1 << (int)Define.Layer.Ground) | (1 << (int)Define.Layer.Monster);
	void UpdateMouseCursor()
    {
        if (Input.GetMouseButton(0))
            return;
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

		//밑은 같음
    }

위 코드와 같이 한다면 누르고 있는 상태에서 마우스를 움직여도 마우스 커서는 기존의 상태를 유지할 것이다.

다른 상황을 구현한다면, 처음 누른 GameObject나 현재 마우스 커서의 Raycast결과와 같은 추가적인 정보가 필요할 것이다.

profile
게임 개발자가 되고 싶은 한 소?년

0개의 댓글