[Unity] Cursor를 컨트롤하는 법
안녕하세요! bonobono-dev 블로그를 운영 중인 게임 개발 꿈나무, 구본후입니다! :)
이번 포스팅에서는 Unity에서 커서를 다루는 방법에 대해, 공부한 내용을 정리해보려고 합니다.
목차로 정리하자면 아래와 같은 내용들로 정리할 수 있습니다!
마우스 위치 Get/Set
커서 텍스쳐에 필요한 세팅들
커서의 상태 변경(Texture, Visiblity)
그럼 위의 목차 순서대로 이야기해보도록 하겠습니다. 설명은 코드 중심으로 진행되는 점, 양해부탁드립니다!
들어가기에 앞서...
- 글쓴이는 Unity 2021.3.20f1 Personal 버전을 사용했습니다.
- 급조한 코드다보니, 부족한 부분이 있을 수 있습니다. 혹시 잘못된 부분이 부분이 있거나,
더 좋은 코드로 대체가 가능할 경우, 피드백 주시면 감사하겠습니다!
마우스 위치 Get
using UnityEngine;
using UnityEngine.InputSystem;
public class CursorPositionGet : Monobehaviour
{
Camera main;
void Awake()
{
main = Camera.main;
}
// 마우스 위치는 기본적으로
// 스크린 좌표계 기준으로 값을 가져옵니다.
// Legacy InputSystem 방식
Vector3 GetMousePositionLegacy()
=> Input.mousePosition;
// New InputSystem 방식
Vector3 GetMousePositionNew()
{
var mouse = Mouse.current;
return mouse.position;
}
// 월드 좌표계 기준으로 마우스 위치를 가져옵니다.
Vector3 GetMousePositionWorld()
=> main.ScreenToWorldPoint(GetMousePositionLegacy());
}
마우스 위치를 가져오는 방식은 두 가지를 생각할 수 있는데, 그것은 Legacy와 New 방식입니다.
Legacy 방식을 사용하면 Input에 있는 mousePosition을 가져오면 됩니다.
New 방식인 경우에는 Mouse의 현재 상태(Mouse.current)를 가져와서 그 위치를 구하면 됩니다.
또한, 만약 마우스 위치를 world 좌표계로서 받고 싶다면, main.ScreenToWorldPoint() 함수를 사용하여, Screen 기준으로 되어 있는 위치 값을 World 기준으로 바꿔주면 됩니다.
마우스 위치 Set
using UnityEngine;
using UnityEngine.InputSystem;
public class CursorControlManager : MonoBehaviour
{
// 마우스의 위치 이동은 Screen 좌표계를 기준으로 이루어집니다.
/* 마우스를 입력 값만큼 이동시킵니다. */
public void MoveMousePosition(Vector2 moveAmount)
{
Mouse.current.WarpCursorPosition(Mouse.current.position.value + moveAmount);
}
/* 마우스를 특정 위치로 순간이동시킵니다. */
public void ChangeMousePosition(Vector2 screenPosition)
{
Mouse.current.WarpCursorPosition(screenPosition);
}
}
마우스 위치를 바꾸는 방식은 New 방식만 알아서, 일단은 이런 식으로 사용했습니다. (혹시 Legacy로 하는 방식을 아시는 분, 알려주시면 감사하겠습니다!
마우스 이동에 대한 유의사항은 Unity 공식 메뉴얼에 적혀있습니다. [메뉴얼 주소]
Mouse support | Input System | 1.0.2
Mouse support The Input System represents mouse input with the Mouse Device layout that the Mouse class implements. Mice are based on the Pointer layout. To query the last used or last added mouse, use Mouse.current. var mouse = Mouse.current; Note: The In
docs.unity3d.com
커서 텍스쳐에 필요한 세팅들
커서의 Texture는 아래의 Project Settings / Player에서 바꿀 수 있습니다.
하지만 여기서 제대로된 설정이 되어있지 않은 텍스쳐를 커서로 쓰려고 하는 순간,
Unity에서 다음과 같이 경고와 오류를 띄웁니다.
자세히 읽어보면, Cursor Texture가 갖춰야할 것은 다음과 같습니다.
- RGBA32 Format
- 읽을 수 있어야 함. (Readable)
- alphalsTransparency 체크
- Generate MipMaps 해제
이렇게 세팅한 뒤, 이 셋팅을 Preset으로 저장해두고 재활용하면, 커서 텍스쳐 셋팅이 한 층 편리해집니다.
커서의 상태 변경
using UnityEngine;
public class CursorControlManager : MonoSingleton<CursorControlManager>
{
public void SetCursorTex(Texture tex, Vector2 hotspot, CursorMode mode)
{
Cursor.SetCursor(tex, Vector2.zero, CursorMode.Auto);
}
}
이 함수는 Cursor의 세팅하는 바꿔주는 함수입니다. 그런데 텍스쳐를 바꾸는 것만이 필요한 것이 아니기 때문에, 다음과 같은 3가지 옵션을 가집니다.
- texture : 커서의 텍스쳐를 결정합니다. 당연하지만, 이 텍스쳐는 위의 셋팅을 지켜야 합니다.
- hotspot : 텍스쳐의 오프셋을 조절합니다. 단, 텍스쳐의 중심은 좌측 상단 부분으로 합니다.
- cursorMode : 커서를 플랫폼에 맞게 하드웨어 커서로 할 것인지, 강제로 소프트웨어 커서로 할 것인지를 정합니다.
끝맺으며...
이번 포스팅에서는 제가 공부한 Unity의 커서를 컨트롤하는 방법을 총정리해보았습니다. 글을 쓰면서 다시 한 번 공부를 하게 되서 "실제 Unity에서 커서를 세팅할 일이 있을 때, 바로바로 할 수 있겠다"는 자신감(?)이 생기게 된 것 같습니다!
다음 포스팅에서는 c++이나 디자인 패턴, 자료 구조쪽과 관련된 글을 작성할까 생각하고 있습니다. 작성하는 과정에서 개발자로서 성장하는 하나의 과정이 되면 좋겠습니다.
부족한 글 끝까지 읽어주셔서 감사합니다! :)