UGUI-自定義
自定義 IMGUI 控件
雖然 Unity 的 IMGUI 系統(tǒng)主要用于創(chuàng)建開發(fā)者工具和調(diào)試界面,但仍可以通過多種方式進(jìn)行自定義并設(shè)置樣式。在 Unity 的 IMGUI 系統(tǒng)中,可微調(diào)控件的外觀,為控件添加大量細(xì)節(jié)??丶庥^由?GUIStyle?決定。默認(rèn)情況下,如果創(chuàng)建控件時未定義 GUIStyle,則會應(yīng)用 Unity 的默認(rèn) GUIStyle。此樣式是 Unity 的內(nèi)部樣式,可在已發(fā)布的游戲中將此樣式用于快速原型設(shè)計,或者如果選擇不對控件進(jìn)行樣式設(shè)置,則會采用此樣式。
當(dāng)有大量不同的 GUIStyle 可供使用時,可在單個?GUISkin?中定義這些樣式。GUISkin 只不過是 GUIStyle 的集合。
樣式如何改變 GUI 控件的外觀
GUIStyle 旨在模仿 Web 瀏覽器的層疊樣式表 (CSS)。不過,許多不同的 CSS 方法經(jīng)過了改編,包括對用于樣式設(shè)置的各個狀態(tài)屬性進(jìn)行劃分,在內(nèi)容和外觀之間進(jìn)行分離,等等。
控件定義內(nèi)容,而樣式定義外觀。通過這種機(jī)制可以創(chuàng)建外觀像普通__按鈕 (Button)__ 但功能為__開關(guān) (Toggle)__ 的組合控件。

皮膚和樣式之間的區(qū)別
如前文所述,GUISkin 是 GUIStyle 的集合。樣式定義了 GUI 控件的外觀。如果要使用樣式,則不必使用皮膚。


使用樣式
所有 GUI 控件函數(shù)都有可選的最后一個參數(shù):用于顯示控件的 GUIStyle。如果忽略此參數(shù),則會使用 Unity 的默認(rèn) GUIStyle。函數(shù)內(nèi)部會將控件類型的名稱作為字符串應(yīng)用,因此?GUI.Button()?使用“button”樣式,__GUI.Toggle()__ 使用“toggle”樣式,等等。若要覆蓋控件的默認(rèn) GUIStyle,可將其指定為最后一個參數(shù)。
/* 將默認(rèn)控件樣式覆蓋為 UnityGUI 默認(rèn)樣式中的其他樣式 */
// JavaScript
function OnGUI()
{
? ? // 創(chuàng)建使用 "box" GUIStyle 的標(biāo)簽。
? ? GUI.Label(Rect(0, 0, 200, 100), "Hi - I'm a label looking like a box", "box");
? ? // 創(chuàng)建使用 "toggle" GUIStyle 的按鈕
? ? GUI.Button(Rect(10, 140, 180, 20), "This is a button", "toggle");
}
// C#
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour
{
? ? void OnGUI()
? ? {
? ? ? ? // 創(chuàng)建使用 "box" GUIStyle 的標(biāo)簽。
? ? ? ? GUI.Label(new Rect(0, 0, 200, 100), "Hi - I'm a label looking like a box", "box");
? ? ? ? // 創(chuàng)建使用 "toggle" GUIStyle 的按鈕
? ? ? ? GUI.Button(new Rect(10, 140, 180, 20), "This is a button", "toggle");
? ? }
}

創(chuàng)建公共變量 GUIStyle
聲明 GUIStyle 公共變量時,樣式的所有元素都將顯示在?Inspector?中。在該面板中可以編輯所有不同的值。
/* 將默認(rèn)控件樣式覆蓋為自定義的控件樣式 */
// JavaScript
var customButton : GUIStyle;
function OnGUI()
{
? ? // 創(chuàng)建按鈕。將上面定義的 GUIStyle 作為要使用的樣式傳入
? ? GUI.Button(Rect(10, 10, 150, 20), "I am a Custom Button", customButton);
}
// C#
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour
{
? ? public GUIStyle customButton;
? ? void OnGUI()
? ? {
? ? ? ? // 創(chuàng)建按鈕。將上面定義的 GUIStyle 作為要使用的樣式傳入
? ? ? ? GUI.Button(new Rect(10, 10, 150, 20), "I am a Custom Button", customButton);
? ? }
}
更改不同的樣式元素
聲明 GUIStyle 后,可在 Inspector 中修改該樣式。可以定義大量狀態(tài),并應(yīng)用于任何類型的控件。

必須先為控件狀態(tài)分配?Background?顏色,然后再應(yīng)用指定的?Text Color。
有關(guān)各個 GUIStyle 的更多信息,請閱讀?GUIStyle 組件參考頁面。
使用皮膚
對于較復(fù)雜的 GUI 系統(tǒng),將一系列樣式集中保存在一個位置是很有意義的。這就是 GUISkin 的作用。GUISkin 包含多種不同的樣式,基本上能為所有 GUI 控件提供完整的外觀修改。
創(chuàng)建新的 GUISkin
要創(chuàng)建 GUISkin,請從菜單欄中選擇?Assets > Create > GUI Skin。隨后將在 Project 文件夾中創(chuàng)建一個 GUI Skin。選擇該 GUI Skin 即可在 Inspector 中查看其定義的所有 GUIStyle。
將皮膚應(yīng)用于 GUI
要使用已創(chuàng)建的皮膚,請將其分配給?OnGUI()?函數(shù)中的?GUI.skin。
/* 創(chuàng)建一個屬性來引用要使用的皮膚 */
// JavaScript
var mySkin : GUISkin;
function OnGUI()
{
? ? // 將該皮膚指定為當(dāng)前使用的皮膚。
? ? GUI.skin = mySkin;
? ? // 創(chuàng)建按鈕。此時將從分配給 mySkin 的皮膚獲得默認(rèn)的 "button" 樣式。
? ? GUI.Button(Rect(10, 10, 150, 20), "Skinned Button");
}
// C#
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour
{
? ? public GUISkin mySkin;
? ? void OnGUI()
? ? {
? ? ? ? // 將該皮膚指定為當(dāng)前使用的皮膚。
? ? ? ? GUI.skin = mySkin;
? ? ? ? // 創(chuàng)建按鈕。此時將從分配給 mySkin 的皮膚獲得默認(rèn)的 "button" 樣式。
? ? ? ? GUI.Button(new Rect(10, 10, 150, 20), "Skinned Button");
? ? }
}
通過單個?OnGUI()?調(diào)用即可按需多次切換皮膚。
/* 在同一個 OnGUI() 調(diào)用切換皮膚的示例 */
// JavaScript
var mySkin : GUISkin;
var toggle = true;
function OnGUI()
{
? ? // 將該皮膚指定為當(dāng)前使用的皮膚。
? ? GUI.skin = mySkin;
? ? // 創(chuàng)建開關(guān)。此時將從分配給 mySkin 的皮膚獲得 "button" 樣式。
? ? toggle = GUI.Toggle(Rect(10, 10, 150, 20), toggle, "Skinned Button", "button");
? ? // 將當(dāng)前皮膚指定為 Unity 的默認(rèn)值。
? ? GUI.skin = null;
? ? // 創(chuàng)建按鈕。此時將從內(nèi)置皮膚獲得默認(rèn)的 "button" 樣式。
? ? GUI.Button(Rect(10, 35, 150, 20), "Built-in Button");
}
// C#
using UnityEngine;
using System.Collections;
public class GUITest : MonoBehaviour
{
? ? public GUISkin mySkin;
? ? private bool toggle = true;
? ? void OnGUI()
? ? {
? ? ? ? // 將該皮膚指定為當(dāng)前使用的皮膚。
? ? ? ? GUI.skin = mySkin;
? ? ? ? // 創(chuàng)建開關(guān)。此時將從分配給 mySkin 的皮膚獲得 "button" 樣式。
? ? ? ? toggle = GUI.Toggle(new Rect(10, 10, 150, 20), toggle, "Skinned Button", "button");
? ? ? ? // 將當(dāng)前皮膚指定為 Unity 的默認(rèn)值。
? ? ? ? GUI.skin = null;
? ? ? ? // 創(chuàng)建按鈕。此時將從內(nèi)置皮膚獲得默認(rèn)的 "button" 樣式。
? ? ? ? GUI.Button(new Rect(10, 35, 150, 20), "Built-in Button");
? ? }
}
更改 GUI 字體大小
此示例將展示如何通過代碼來動態(tài)更改字體大小。
首先在 Unity 中創(chuàng)建一個新項目。然后創(chuàng)建一個名為 Fontsize.cs 的 C# 腳本,并將以下代碼粘貼到其中:
// C# 示例
using UnityEngine;
using System.Collections;
public class Fontsize : MonoBehaviour
{
? ? void OnGUI()
? ? {
? ? ? ? //將 GUIStyle 樣式設(shè)置為標(biāo)簽
? ? ? ? GUIStyle style = GUI.skin.GetStyle("label");
? ? ? ? //將樣式字體大小設(shè)置為隨時間增大和減小
? ? ? ? style.fontSize = (int)(20.0f + 10.0f * Mathf.Sin(Time.time));
? ? ? ? //創(chuàng)建一個標(biāo)簽并使用當(dāng)前設(shè)置來顯示
? ? ? ? GUI.Label(new Rect(10, 10, 200, 80), "Hello World!");
? ? }
}
保存腳本并將其附加到空游戲?qū)ο螅缓髥螕舨シ乓圆榭醋煮w的大小隨時間循環(huán)增大和減小的行為。此時可能會注意到字體不能平滑地改變大小,這是因為字體大小不是無限數(shù)量的。
此特定示例要求加載默認(rèn)字體 (Arial) 并將其標(biāo)記為動態(tài)。無法更改未標(biāo)記為動態(tài)的任何字體的大小。