화면에 있는 마우스커서가 무엇을 가리키는지에 따라 마우스커서의 아이콘을 변경하고 싶을 때가 있다. 이것을 구현하기 위해서는 다음과 같은 단계를 거쳐야 한다.
GameObject를 찾는 것은 Raycast를 사용할 것이고 마우스커서를 바꾸는 것은 Unity 내부기능을 사용할 것이다.
마우스커서는 어떤 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
를 입력받는다.
만약 마우스를 누른상태로 다른 UI나 캐릭터로 커서를 옮기면 어떻게 될까? 이벤트를 어떻게 나눴고 구현을 어떻게 했느냐에 따라 다르겠지만 Press
와 Click
만 나누었다면 매 프레임마다 이벤트가 인식되어 아이콘이 변경될 것이다.
UnityEngine.Input
에서 지원하는 마우스이벤트함수는 총 세가지이다.
위 세가지 함수를 이용해 Click
과 같이 Unity에서 지원하지 않는 Action을 구현할 수 있다.
Click
이벤트를 발생시킨다.시간의 기준은 두 시점의 상대적인 기준이면 된다. Time
클래스를 사용해도 되고 실제 현실의 ms
단위를 사용해도 된다.
락온은 어떻게 정의하느냐에 따라 작동하는 방법이 달라진다.
마우스를 누르고 있는 상태에서,
위 세가지 상황에서 가장 구현하기 쉬운 상황은 마지막 상황이다. 구현하는 방법은 간단하다 마우스커서를 변경하고자 할 때, 마우스가 눌린 상태라면 변경을 하지않는 것이다.
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결과와 같은 추가적인 정보가 필요할 것이다.