유니티에서 GUITexture 사용 예
유니티에서 GUITexture 를 사용하면 Scene 뷰 상의 3차원 영역에 위치한 오브젝트가 아닌 카메라의 2차원 화면에 위치한 2차원 이미지를 출력할 수 있으며 장면이 바뀌더라도 항상 화면의 지정된 영역과 위치에 머물러 있는 GUI 를 구현할 수 있다
또한 GUITexture 의 중요한 특징 중에 하나는 다수개의 카메라를 사용할 때 특정 카메라에는 GUITexture 가 보이지 않도록 설정할 수 있다는 점이다. 카메라가 가진 콤포넌트 중에 GUILayer 를 Inspector 뷰에서 체크 해제하면 해당 카메라는 GUITexture를 화면에 출력하지 않게 된다. 이점을 이용하여 미니맵을 보여주는 카메라에는 GUITexture 가 보여지도록 하고 Main Camera 에는 GUITexture 가 보이지 않도록 할 수 있다.
여기서는 게임뷰 상의 미니맵을 출력하는 카메라는 현재 게임 오브젝트의 위치를 빨간 사각형 이미지로 표시하도록 설정하려고 한다
GameObject > Create Other > GUI Texture 를 선택하면 아래 그림처럼 모든 카메라의 영상에 GUITexture 가 보여지게 된다
[Scene 뷰와 Hierarchy 뷰에 GUITexture 오브젝트가 추가된 상태]
위의 그림에서 Inspector 뷰의 GUITexture항목의 Texture 란에 다른 이미지파일을 드래그하여 설정하면 원하는 이미지로 변경할 수 있다
메인 카메라에서는 GUITexture가 보여지지 않도록 하려면 아래처럼 메인 카메라의 GUILayer 콤포넌트를 해제하면 된다
[Main Camera의 GUILayer 콤포넌트를 해제하여 화면에서 GUITexture 가 보이지 않고 미니맵 카메라의 영상에서는 여전히 보여진다]
아래의 코드를 새로 생성한 카메라에 드래그하여 할당하고 public 변수는 Inspector 뷰에서 해당 오브젝트를 드래그하여 설정하면 된다
using UnityEngine;
using System.Collections;
public class MiniMapCam : MonoBehaviour {
public GameObject tank;
public GUITexture redRect;
public Camera miniCam;
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update () {
Vector3 viewPortPos = miniCam.WorldToViewportPoint(tank.transform.position);
redRect.transform.position = viewPortPos;
}
}
위의 코드에서 사용된 miniCam.WorldToViewportPoint()함수는 Scene 뷰 상의 오브젝트의 위치를 카메라 뷰포트 상의 좌표로 변환해주는 함수이다.
이 함수가 사용되는 이유는 GUITexture 를 2차원 평면인 뷰포트(Viewport)에 배치할 때는 사용되는 X, Y 좌표 체계가 약간 달라서 뷰포트의 좌하단 모서리가 원점(0,0)으로 사용된다. 좌상단 모서리가 원점인 유니티 Scene 뷰의 좌표체계와 약간 차이가 있기 때문에 좌표변환이 필요한 것이다.
Viewport space is normalized and relative to the camera. The bottom-left of the camera is (0,0); the top-right is (1,1). The z position is in world units from the camera.
Viewport : 카메라의 영상이 원래의 크기보다 작게 조정되어 출력되는 평면영역(미니맵 등)
좌하단 모서리가 원점(0,0) ~ (1,1)
Screenspace is defined in pixels. The bottom-left of the screen is (0,0); the right-top is (pixelWidth,pixelHeight). The z position is in world units from the camera.
Screen : 카메라의 영상이 출력되는 평면영역
좌하단 모서리가 원점(0,0) ~ (Screen.width, Screen.height)
[Hierarchy 뷰에서 MiniMapCam을 선택하고 public 변수에 다음과 같이 할당한다]
설정을 마친 후에 실행해보면 탱크가 이동함에 따라서 미니맵에도 탱크의 위치가 GUITexture 에 의해 표시되는 것을 확인할 수 있다