2014. 4. 13. 15:00

빌보드라는 것은 노래 차트가 아니고....

 

3D에서 사용자가 보는 화면은 카메라가 보는 시점입니다.

카메라가 움직이거나 회전해도 카메라를 향해서 바라보는 오브젝트(기능?)를 빌보드(Billboard)라고 합니다.

 

 

1. 'transform.LookAt'사용 하기

'transform.LookAt'은 지정한 위치를 계속 바라보게 하는 메소드입니다.

(참고 : 유니티 스크립트 레퍼런스 - Transform.LookAt)

그냥 타겟만 정하면 알아서 바라봅니다.

이것을 카메라로 지정하면 카메라를 계속 보고 있게 됩니다.

 

문제는 'z'축이 바라보기 때문에 다른 축은 원하는 방향을 보게 할 수가 없죠.

그러니 다른 축을 바라보게 하기 위해서는 그룹이 되는 오브젝트를 넣고 z축을 카메라 방향으로 두고 돌리려는 오브젝트를 안에 넣고 보여주려는 방향을 상위오브젝트의 z축과 같이 해주시면 됩니다.

 

지금 위의 스크린샷은 'GameObject'가 'Plane'을 포함하고 있습니다.

'GameObject'는 z축이 카메라를 보게 될 것이기 때문에 z축을 카메라 방향으로 둡니다.

'Plane'은 이미지는 y축에서만 보입니다.

'Plane'은 'GameObject'에 포함되어 있습니다.

그래서 'GameObject'의 z축은 'Plane'의 보여주고 싶은 방향(y축)과 일치해야 합니다.

 

 

2. 코드 만들기

이전에 썼던 코드와 거의 비슷합니다.

(참고 : [Unity] 특정 오브젝트를 기준으로 화면 회전하기)

 

2-1. GUI 만들기

GUI는 이전에 썼던 코드를 그대로 사용하겠습니다.

using UnityEngine;
using System.Collections;

public class claGUI : MonoBehaviour 
{
	private Rect m_rectScreen;
	private Rect m_rectBtn
		= new Rect (5, 5, 30, 30);
	
	private claCamera m_insCamera;
	
	void Start()
	{
		GameObject goCamera = GameObject.Find("Main Camera");
		m_insCamera = goCamera.GetComponent<claCamera>();
	}
	
	void OnGUI()
	{
		m_rectScreen = new Rect(0f
		                        , 0f
		                        , Screen.width
		                        , Screen.height);
		
		
		//레프트 버튼.
		if (GUI.Button(new Rect(m_rectBtn.x
		                        , (Screen.height / 2) - (m_rectBtn.y / 2)
		                        , 30
		                        , 30)
		               , "◀"))
		{
			m_insCamera.ClickButton(1);
		}
		//업버튼.
		if (GUI.Button(new Rect(Screen.width / 2
		                        , 0
		                        , 30
		                        , 30)
		               , "▲"))
		{
			m_insCamera.ClickButton(2);
		}
		//라이트버튼.
		if (GUI.Button(new Rect(Screen.width - m_rectBtn.xMax
		                        , (Screen.height / 2) - (m_rectBtn.y / 2)
		                        , 30
		                        , 30)
		               , "▶"))
		{
			m_insCamera.ClickButton(3);
		}
		//다운버튼.
		if (GUI.Button(new Rect((Screen.width / 2)
		                        , Screen.height - 30
		                        , 30
		                        , 30)
		               , "▼"))
		{
			m_insCamera.ClickButton(4);
		}
		
		
	}
}

 

이 스크립트을 카메라에 적용합니다.

 

 

2-2. 오브젝트 코드 만들기

오브젝트를 회전시킬 코드를 만들어 봅시다.

using UnityEngine;
using System.Collections;

public class claCamera : MonoBehaviour 
{
	GameObject goTemp;
	GameObject goBillboard;
	
	
	void Start () 
	{
		goTemp = GameObject.Find ("Cube");
		goBillboard = GameObject.Find ("GameObject");
	}

	void Update () 
	{
		
	}
	
	public void ClickButton(int n)
	{
		switch (n)
		{
		case 2:
			//transform.RotateAround (goTemp.transform.position, Vector3.one, 0.1f);
			transform.RotateAround(goTemp.transform.position, Vector3.left, 10f);
			break;
		case 3:
			transform.RotateAround(goTemp.transform.position, Vector3.up, 10f);
			break;
		case 4:
			transform.RotateAround(goTemp.transform.position, Vector3.right, 10f);
			break;
		case 1:
			transform.RotateAround(goTemp.transform.position, Vector3.down, 10f);
			break;
		}

		goBillboard.transform.LookAt(transform.position);
	}
}

 

이전 코드와 동일한데 마지막에 'transform.LookAt'를 추가하였습니다.

 

 

3. 테스트해 보기

이제 테스트해봅시다.

 

 

위쪽으로 움직이면 빌보드가 회전하는 현상이 보이는데...원래 그렇습니다 ㅎㅎㅎ

 

 

마무리

'transform.LookAt'은 z축만 바라보는데....

다른 방향으로 보게 하려면 작업을 좀 해야겠네요 ㅡ,.ㅡ;

그냥 다른 오브젝트 안에서 돌리는 게 속이 편할 것 같습니다.

 

아래는 프로젝트 소스입니다.

Billboard.zip
다운로드