본문 바로가기
Unity3D

[Unity3D] 사용자 정의 마우스 커서를 사용하는 방법 (How to Use the Custom Mouse Cursor.)

by 로봇과나무 2014. 7. 2.

각종 다양한 종류의 게임들이 있지만 그 중에서 대중에게 전자 컴퓨터 게임의 세계를 알렸던 겔러그(Galaga, 1981, 남코, 위키백과)를 필두로 현재까지도 끊임없이 인기를 누리는 장르은 바로 슈팅(shooting) 게임일 것입니다. 슈팅게임의 화면을 구성하는 빠지지 않는 요소 중 하나는 바로 타겟(target) 모양의 마우스 커서(mouse cursor)를 들 수 있을 것입니다. 해서,타겟 모양의 마우스 커서를 Unity3D에서 설정하고, 게임화면상에서 사용하도록 하고자 합니다. 물론, 다른 장르의 게임에서도 게임의 성격을 잘 살릴 수 있는 여러가지 모양의 마우스 커서를 만들어 사용할 수 있을 것입니다.

먼저 가장 잘 사용할 수 있는 여러가지 그래픽 툴을 사용하여 커서로 사용할 이미지 파일을 제작합니다. 이때, 유니티 엔진 및 GPU(Graphic Processing Unit)는 2의 n승의 텍스처를 좋아하므로 32 x 32 나 64 x 64의 크기로 만드는 것이 좋습니다. 또한, 당연한 것이지만 빈 영역은 투명처리해야 하며, 완성된 파일은 PNG 형으로 저장하는 것이 좋습니다. 아래는 본인이 제작한 64 x 64의 크기를 갖는 타겟 모양의 그림입니다.

이제 모양이 준비되었으면, 유니티 프로젝트의 Textures 폴더에 저장하고, 다음 그림과 같이 유니티에서 해당 파일을 선택하여, 텍스처 임포트 셋팅(Texture Import Settings)를 합니다. 이때, Texture Type은 Cursor로, Wrap Mode는 Clamp로 그리고 Filter Mode는 Point로 합니다. 그리고 아래쪽의 Apply 버튼을 클릭합니다., 

 

이제, 커서로 사용할 텍스처가 준비되었습니다. 그러면 이제 커서를 변경 시켜 줄 스크립트를 만들 차례입니다. 우선 스크립트를 보기에 앞서, 인스펙터 뷰에 나타나게 될 스크립트 컴포넌트의 사용자 인터페이스를 보면서 설명하는 것이 나을 듯 합니다. 왜냐하면, 사용자 인터페이스를 보면 스크립트의 구성이 어떠할지 미리 짐작할 수 있기 때문입니다.

 

컴포넌트를 보시면 Mouse Cursor (Script)라는 이름의 컴포넌트 이며, 스크립트 타입이라는 것을 나타내고 있습니다. Cursor Texture라는 항목이 보입니다. 이곳은 마우스 커서로 사용할 텍스처를 입력 받는 곳입니다. 포스팅의 바로 윗 부분에서 텍스처의 타입을 Cursor로 설정해 놓은 그 텍스처를 선택하시면 됩니다. 그리고, Hot Spot Is Center라는 체크박스 항목이 있는데 이곳은 기본적으로 체크되어 있으며, 커서 텍스처의 중심이 마우스의 좌표가 될 것인지 아닌지 선택하는 부분입니다. 슈팅 게임에서 사용될 타겟 모양의 커서의 경우에는 이곳에 체크를 하여야 할 것입니다. 가끔은 타겟 모양의 커서라 할 지라도 정확히 중심이 아닌 곳을 마우스의 좌표로 설정할 필요성이 있는 경우가 있을 수 있습니다. 그럴 경우에는 Hot Spot Is Center의 체크를 제거하고 Adjust Hot Spot에 좌표를 입력하면 됩니다. Adjust Hot Spot의 X 값과 Y 값은 기본적으로 모두 0으로 설정되어 있습니다. 그것은 일반적인 화살표 모양의 커서는 화살촉의 끝 부분이 마우스의 좌표로 사용되기 때문입니다. 그럼, 이제 스크립트 코드를 살펴 볼까요?

using UnityEngine;
using System.Collections;

public class MouseCursor : MonoBehaviour {

	//마우스 포인터로 사용할 텍스처를 입력받습니다.
	public Texture2D cursorTexture ;
	//텍스처의 중심을 마우스 좌표로 할 것인지 체크박스로 입력받습니다.
	public bool hotSpotIsCenter = false;
	//텍스처의 어느부분을 마우스의 좌표로 할 것인지 텍스처의 
	//좌표를 입력받습니다.
	public Vector2 adjustHotSpot = Vector2.zero;
	//내부에서 사용할 필드를 선업합니다.
	private Vector2 hotSpot;
	public void Start(){

		//코루틴을 사용합니다. TargetCursor()함수를 호출합니다.
		StartCoroutine ("MyCursor");
	}
	//MyCursor()라는 이름의 코루틴이 시작됩니다.
	IEnumerator MyCursor() {

		//모든 렌더링이 완료될 때까지 대기할테니 렌더링이 완료되면 
		//깨워 달라고 유니티 엔진에 게 부탁하고 대기합니다.
		yield return new WaitForEndOfFrame();

		//텍스처의 중심을 마우스의 좌표로 사용하는 경우 
		//텍스처의 폭과 높이의 1/2을 hot Spot 좌표로 입력합니다.
		if (hotSpotIsCenter) {
			hotSpot.x = cursorTexture.width / 2;
			hotSpot.y = cursorTexture.height / 2;
		} else {
			//중심을 사용하지 않을 경우 Adjust Hot Spot으로 입력 받은 
			//것을 사용합니다.
			hotSpot = adjustHotSpot;
		}
		//이제 새로운 마우스 커서를 화면에 표시합니다.
		Cursor.SetCursor (cursorTexture, hotSpot, CursorMode.Auto);
	}
}

스크립트 코드에서 Start()함수에 Cursor.SetCursor (); 함수의 선언을 넣지 않고 별도의 코루틴 함수를 만들어 렌더링이 완료될때까지 기다린 후,  Cursor.SetCursor ();를 한 이유는 게임이 실행되는 기기의 성능에 따라서, 커서가 표시되지 않을 수 있기 때문입니다. 참고로 코루틴을 사용하지 않고 Invoke()함수를 호출하여 일정시간 대기 후 실행시키는 방법도 사용할 수 있습니다.

이제 스크립 코드도 완성되었으니, 하당 스크립트 컴포넌트를 메인 카메라나, 빈 게임오브젝트(Empty Game Object)에 등록한 후 사용하시면 되겠습니다. 아래 게임 화면은 제작한 타겟 모양의 마우스 커서를 적용한 후 갈무리 한 화면입니다.

항상 행운과 긍정적인 성과가 있으시길 기원합니다. 끝.