Unity의 IMGUI 시스템은 주로 개발자 툴과 디버깅 인터페이스를 만드는 데 사용되지만 여러 가지 방법으로 커스터마이즈하고 스타일을 지정할 수 있습니다. Unity의 IMGUI 시스템에서는 컨트롤의 형상을 다양한 디테일로 미세 조정할 수 있습니다. 컨트롤 형상은 GUIStyle 로 묘사됩니다. 기본적으로 GUIStyle을 정의하지 않고 컨트롤을 생성하면 Unity의 기본 GUIStyle이 적용됩니다. 이 스타일은 Unity 내부에 있으며, 빠른 프로토타이핑을 위해 퍼블리시된 게임이나 컨트롤의 스타일을 지정하지 않은 경우에 사용할 수 있습니다.
여러 개의 GUIStyle을 사용하는 경우 전부를 하나의 GUISkin 에서 정의할 수 있습니다. GUISkin은 GUIStyle의 컬렉션에 불과합니다.
GUIStyle은 웹 브라우저의 CSS(Cascading Style Sheets)를 모방하도록 설계되었습니다. 스타일 지정을 위한 개별 상태 프로퍼티의 차별화 및 콘텐츠와 형상의 분리를 비롯하여 다양한 CSS 방법론이 적용되었습니다.
컨트롤이 콘텐츠를 정의하는 경우 스타일이 형상을 정의합니다. 이렇게 하면 일반 버튼 처럼 보이는 기능 토글 과 같은 조합을 만들 수 있습니다.
앞서 언급했듯이 GUISkin은 GUIStyle의 컬렉션입니다. 스타일은 GUI 컨트롤의 형상을 정의합니다. 스타일을 사용하려는 경우 스킨을 사용할 필요가 없습니다.
인스펙터에 표시된 단일 GUISkin - 여러 GUIStyle이 포함되어 있습니다.
모든 GUI 컨트롤 함수에는 GUIStyle이라는 마지막 파라미터가 옵션으로 제공되며, 이는 컨트롤을 표시하는 데 사용됩니다. 생략될 경우 Unity의 기본 GUIStyle이 사용됩니다. 이는 컨트롤 유형의 이름을 문자열로 적용하여 내부적으로 작동하므로 GUI.Button() 은 ‘버튼’ 스타일을 사용하고, GUI.Toggle() 은 ‘토글’ 스타일을 사용합니다. 컨트롤의 기본 GUIStyle을 마지막 파라미터로 지정하여 오버라이드할 수 있습니다.
/* Override the default Control Style with a different style in the UnityGUI default Styles */
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
void OnGUI () {
// Make a label that uses the "box" GUIStyle.
GUI.Label (new Rect (0,0,200,100), "Hi - I'm a label looking like a box", "box");
// Make a button that uses the "toggle" GUIStyle
GUI.Button (new Rect (10,140,180,20), "This is a button", "toggle");
}
}
공용 GUIStyle 변수를 선언하는 경우 스타일의 모든 요소가 인스펙터 에 표시됩니다. 여기서 다른 값을 모두 편집할 수 있습니다.
/* Overriding the default Control Style with one you've defined yourself */
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
public GUIStyle customButton;
void OnGUI () {
// Make a button. We pass in the GUIStyle defined above as the style to use
GUI.Button (new Rect (10,10,150,20), "I am a Custom Button", customButton);
}
}
GUIStyle을 선언하면 인스펙터에서 해당 스타일을 수정할 수 있습니다. 다양한 상태를 정의하고 모든 컨트롤 유형에 적용할 수 있습니다.
지정된 Text Color 가 적용되기 전에 모든 컨트롤 상태에 Background 컬러가 할당되어야 합니다.
개별 GUIStyle에 대한 자세한 내용은 GUIStyle 컴포넌트 레퍼런스 페이지를 참조하십시오.
더 복잡한 GUI 시스템의 경우 한 곳에 스타일 컬렉션을 저장하는 것이 합리적입니다. 이러한 작업이 GUISkin의 역할입니다 GUISkin에는 여러 가지 스타일이 포함되어 있으며, 기본적으로 모든 GUI 컨트롤에 적합한 스타일을 제공합니다.
GUISkin을 생성하려면 메뉴 바에서 Assets->Create->GUI Skin 을 선택해야 합니다. 이렇게 하면 프로젝트 폴더에 GUI Skin이 생성됩니다. 인스펙터에서 스킨에 정의된 모든 GUIStyle을 확인하려면 이를 선택합니다.
생성한 스킨을 사용하려면 OnGUI() 함수의 GUI.skin 에 스킨을 할당해야 합니다.
/* Make a property containing a reference to the skin you want to use */
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
public GUISkin mySkin;
void OnGUI () {
// Assign the skin to be the one currently used.
GUI.skin = mySkin;
// Make a button. This will get the default "button" style from the skin assigned to mySkin.
GUI.Button (new Rect (10,10,150,20), "Skinned Button");
}
}
단일 OnGUI() 호출을 통해 스킨을 원하는 만큼 교체할 수 있습니다.
/* Example of switching skins in the same OnGUI() call */
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour {
public GUISkin mySkin;
private bool toggle = true;
void OnGUI () {
// Assign the skin to be the one currently used.
GUI.skin = mySkin;
// Make a toggle. This will get the "button" style from the skin assigned to mySkin.
toggle = GUI.Toggle (new Rect (10,10,150,20), toggle, "Skinned Button", "button");
// Assign the currently skin to be Unity's default.
GUI.skin = null;
// Make a button. This will get the default "button" style from the built-in skin.
GUI.Button (new Rect (10,35,150,20), "Built-in Button");
}
}
이 예제는 코드를 사용하여 폰트 크기를 동적으로 변경하는 방법을 설명합니다.
먼저 Unity에서 새 프로젝트를 생성해야 합니다. 그런 다음, Fontsize.cs라는 C# 스크립트를 생성한 후 다음 코드를 붙여넣습니다.
using UnityEngine;
using System.Collections;
public class Fontsize : MonoBehaviour
{
void OnGUI ()
{
//Set the GUIStyle style to be label
GUIStyle style = GUI.skin.GetStyle ("label");
//Set the style font size to increase and decrease over time
style.fontSize = (int)(20.0f + 10.0f * Mathf.Sin (Time.time));
//Create a label and display with the current settings
GUI.Label (new Rect (10, 10, 200, 80), "Hello World!");
}
}
스크립트를 저장하고 빈 게임 오브젝트에 연결합니다. 플레이 버튼을 클릭하면 시간이 지나면서 폰트의 크기가 커지거나 작아집니다. 폰트 크기가 매끄럽게 변경되지 않는데, 폰트 크기가 무한하지 않기 때문입니다
이 예제에서는 기본 폰트(Arial)를 로드하여 동적으로 표시해야 합니다. 동적으로 표시되지 않은 폰트의 크기는 변경할 수 없습니다.