본문 바로가기

Unity3D Tank/Texture2D

Texture2D in Unity

유니티에서 Texture2D 를 사용하여 2차원 이미지를 장면에 출력하는 예


유니티가 표현하는 3차원 공간은 결국 카메라 영상에 담겨 2차원 평면에 출력되는데 3차원 공간이 아닌 카메라 영상이 출력되는 평면(2차원 평면)의 좌표를 이용하여 이미지를 출력하려고 할 때 GUITexture, Texture2D를 생각해 볼 수 있는데, 여기서는 Texture2D를 사용해서 이미지를 출력하려고 한다.


Camera 에 디폴트로 설정되는 GUILayer 콤포넌트를 해제하면 Scene뷰에 추가된 GUITexture는 해당 카메라의 영상에서 보여지지 않지만 Texture2D 에 포함된 이미지는 GUILayer의 해제여부와 무관하게 화면에 출력된다


Texture2D 가 포함한 이미지는 GUI.DrawTexture() 함수를 이용하여 스크린에 출력되는데 아규먼트로 전달되는 좌표는 스크린 좌표로 사용되므로 영상이 출력되는 영역을 Screen, Viewport 로 구분하지 않고 무조건 Screen 좌표로 사용된다.

그러므로 GUI.DrawTexture()를 이용하여 출력되는 Texture2D는 미니맵으로 자주 사용되는 Viewport 영역을 타겟으로 사용하기에는 부적합하다고 할 수 있으며 미니맵에만 출력하려는 이미지는 메인 카메라의 GUILayer콤포넌트를 해제하고 미니맵 카메라는 체크하여 GUITexture 를 통해 화면에 출력하는 것이 좋을 것이다


준비(Resources 폴더에 이미지 드래그)

프로젝트 뷰에 원하는 이미지 파일을 드래그하여 Assets/Resources 폴더에 임포트한다. Resources 폴더의 위치는 Assets 아래에만 있으면 되고, Resources 폴더가 다수개 있더라도 문제가 되지 않는다


GameObject > Create Empty 를 선택하여 Scene 뷰에 빈 오브젝트를 생성하고 아래의 코드를 할당한다


using UnityEngine;

using System.Collections;


public class Texture2DScript : MonoBehaviour {


public Camera mainCam;

private Texture2D image; // public 으로 선언할 경우 Inspector 뷰에서 드래그하여 할당할 수 있다


// Use this for initialization

void Start() {

// 프로젝트뷰 Assets 아래의 Resources 폴더에 지정된 이미지 파일이 있어야 함

// Resources 폴더의 위치는 프로젝트뷰의 몇단계 하위에 있더라도 상관없다

// 이미지 파일 이름에서 확장자를 사용하면 안된다

image = (Texture2D) Resources.Load("red_rect");

}

// Update is called once per frame

void Update () {

}

void OnGUI() {

// (0,0)의 위치는 게임뷰의 좌상단 모서리에 고정된 이미지를 보여준다

//GUI.DrawTexture(new Rect(0f, 0f, image.width, image.height), image);


// 게임오브젝트를 따라다니는 이미지

Vector3 point = mainCam.WorldToScreenPoint (gameObject.transform.position);

GUI.DrawTexture(new Rect(point.x, point.y, image.width, image.height), image);

}

}



위의 코드에서 GUI.DrawTexture()함수를 이용하여 Texture2D 이미지를 출력할 수 있는데, 좌표는 스크린 평면에 이미지를 출력해야 하고 원하는 게임오브젝트의 위에 출력해야 하므로 3차원 공간의 게임 오브젝트의 위치를 2차원 스크린 평면 좌표로 변환할 필요가 있다. 이런 경우에 사용하는 함수가 WorldToScreenPoint() 이다

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.


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.



[Texture2D 이미지를 3차원 공간의 게임 오브젝트 위에 출력하는 장면]