우리는 평소 디버깅할 때 Debug.Log로 데이터 값을 찍어내곤했습니다.
하지만 여러명이 서로 다른 스크립트 위치에서 Debug.Log를 찍어대면 콘솔창이 어지러워집니다.
이럴 때 그냥 OnGUI로 화면에 GUI를 그려 데이터값을 가시화하는게 조금 더 좋다고 생각합니다.
사용법은 간단합니다.
디버깅하려고 하는 스크립트에서 OnGUI() 함수 하나만 추가하시면 됩니다.
public class MeleeAttack : Attack
{
public int attackStack = 0; // attackStack을 디버깅 할 예정입니다.
private void OnGUI() {
GUIStyle style = new GUIStyle();
style.fontSize = 54;
style.normal.textColor = Color.green;
GUI.Label(new Rect(5,525,Screen.width,20), "공격 스택" + attackStack.ToString(), style);
}
}
위 코드 예시에서는 제 MeleeAttack.cs 파일에다가 해봤는데 MonoBehaviour만 상속하면 다 작동 가능합니다.
그냥 간단한 변수를 가시화한 코드입니다.
OnGUI() 함수는 Update문 처럼 매 프레임마다 호출됩니다.
이 때 함수 내에 구성한 그래픽대로 화면에 찍어주는 그래픽 코드입니다.
또한 중요한 점이 Update처럼 해당 오브젝트(스크립트)가 활성화될 때만 계속 호출됩니다.
따라서 오브젝트(스크립트)를 끄면 비활성화되서 GUI를 더이상 안그려서 화면에 그린게 사라집니다.
툴팁이 있어서 여러분도 간단하게 구성가능하지만 몇가지 예시를 알려드리겠습니다.
버튼 그리기
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
void OnGUI () {
// 배경 박스 만들기
GUI.Box(new Rect(10,10,100,90), "Loader Menu");
// 버튼 하나 만들고 클릭시 true가되어 함수 호출
if(GUI.Button(new Rect(20,40,80,20), "Level 1")) {
//Application.LoadLevel(1);
}
// 두번 째 버튼 만들기
if(GUI.Button(new Rect(20,70,80,20), "Level 2")) {
//Application.LoadLevel(2);
}
}
}
보시다시피 GUI.Box를 호출하면 인자로 Rect 위치 좌표와 입력 테스트를 넣어주면 됩니다.
해당 박스는 제일 먼저 그렸으므로 아래에 잘 배치가 됩니다.
순서 바꾸고 싶으면 GUI.Box 코드를 버튼 코드들 밑으로 내리면 됩니다.
Rect()에는 인자로 Rect 좌표뿐 아니라 가로 세로 길이도 포함됩니다.
깜빡이는 버튼 만들기
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
void OnGUI () {
if (Time.time % 2 < 1) {
if (GUI.Button (new Rect (10,10,200,20), "2초마다 깜빡이는 버튼")) {
print ("클릭");
}
}
}
}
위 코드는 2초마다 깜빡이는 버튼을 GUI에 그렸습니다.
Time.time은 선언하는 순간 카운트가 되기 시작하므로 이를 나머지 2 해서 딱 떨어지면 2초가 지나간 것으로 간주해서 2초를 카운팅 가능한 방식입니다.
그리고 2초마다 GUI.Button을 그리는 것입니다.
아이콘 그리기
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
public Texture2D icon; // 아이콘 이미지
void OnGUI () {
GUI.Box (new Rect (10,10,100,50), new GUIContent("텍스트 내용", icon));
}
}
GUIContent에는 텍스트와 Texture이 들어가는데 이를 통해 이미지를 띄울 수 있습니다.
위치 Position
지금까지 Rect()로 GUI 위치를 정했습니다.
각각 x, y, 가로, 세로 를 뜻하는 인자였습니다.
이 값들은 모두 픽셀 값 int로 설정됩니다.
원점은 테스트해보시면 아시겠지만 좌측 상단이 원점입니다.
이걸 Screen.width, Screen.height 프로퍼티를 활용하면 각 화면 모서리 위치도 구할 수 있습니다.
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
void OnGUI(){
GUI.Box (new Rect (0,0,100,50), "Top-left");
GUI.Box (new Rect (Screen.width - 100,0,100,50), "Top-right");
GUI.Box (new Rect (0,Screen.height - 50,100,50), "Bottom-left");
GUI.Box (new Rect (Screen.width - 100,Screen.height - 50,100,50), "Bottom-right");
}
}
더 자세한 내용은 메뉴얼에 있습니다.
https://docs.unity3d.com/kr/530/Manual/gui-Basics.html