寫在前面:
寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。主要是唐老師的課程。
一、重要參數、文本、按鈕
GUI相關代碼需要寫在private void OnGUI()中。該函數每幀執行,相當于是專門用于繪制GUI界面的函數,類似生命周期函數,一般只在其中執行GUI相關界面繪制和操作邏輯。該函數在onDisable之前,LateUpdate之后執行。
1、GUI控件繪制的共同點
都是GUI公共類中提供的靜態函數,直接調用即可。
參數都大同小異:
1、位置參數:Rect參數 x,y位置 w,h尺寸
2、顯示文本:string參數
3、圖片信息:Texture參數
4、綜合信息:GUIContent參數
5、自定義樣式:GUIStyle參數
每一種控件都有多種重載,是各個參數的排列組合。必備的參數內容:位置信息、顯示信息
2、文本控件
文本控件可以在game界面輸出文字或者圖片。基本使用是:GUI.Label(new Rect(0, 0, 100, 20),"hello"),其中,Rect的四個參數分別為:x坐標、y坐標、長、寬。第public二個參數為顯示信息,可以為文字也可以為圖片。
綜合信息content,可以聲明public變量,在面板上修改:
其中text是文本信息,image是圖片,Tooltip是提示信息。例如可以設置為鼠標懸停在顯示信息時打印提示信息。
若是要自定義樣式,可以在傳入了位置信息、顯示信息后再傳入style。style信息也是在面板上編輯會更加方便:
這是示例:
public Texture tex;
public Rect rect1;
public GUIContent content;
public GUIStyle style;
private void OnGUI()
{//基本使用//自定義樣式styleGUI.Label(new Rect(0, 0, 100, 20),"hello",style);GUI.Label(new Rect(0, 30, 100, 50), tex);//綜合使用GUI.Label(rect1, content);Debug.Log(GUI.tooltip);
}
game面板上:
3、按鈕控件
按鈕控件的使用與文本控件的使用大同小異。傳入位置、顯示信息等,即可在game屏幕中顯示一個按鈕。由于按鈕控件的返回值是bool,因此可以接收返回值來進行一些邏輯處理。
public Rect buttonrect;
public GUIContent btnContent;
public GUIStyle btnStyle;private void OnGUI()
{if(GUI.Button(buttonrect, btnContent, btnStyle)){Debug.Log("按鈕被點擊");}if(GUI.RepeatButton(buttonrect,btnContent)){Debug.Log("長按按鈕被點擊");}
}
這里說一下常用自定義按鈕樣式,可以在Inspector面板中進行樣式修改:
自定義按鈕常態樣式與常態字體顏色:
修改后:
設置按鈕點擊樣式與點擊字體顏色:
設置鼠標懸停時按鈕樣式與字體顏色:
設置字體樣式、大小:
二、多選框和單選框
1、多選框
(1)基礎
多選框使用Unity提供的API:GUI.Toggle(),里面傳入的參數與上一節的基本相同,只有第二個參數不同。
GUI.Toggle()返回的是bool值,假如此時多選框被點擊,就返回true,如果沒有被點擊返回false。
第一個參數傳入多選框的位置,第二個參數需要傳入該多選框是否被選中,如果是true就代表該多選框被選中,false就代表沒選中。為了動態控制多選框是否被選中,我們可以傳入一個變量來決定當前是true還是false。結合GUI.Toggle()的返回值,我們可以直接將這一幀的返回值傳入下一幀的GUI.Toggle()中,這樣就可以保證下一幀傳入的值為true,代碼如下:
private bool isSel;
private bool isSel2;
private void OnGUI()
{isSel = GUI.Toggle(new Rect(0, 0, 100, 30), isSel, "效果開關");isSel2 = GUI.Toggle(new Rect(0, 40, 100, 30), isSel2, "音效開關", style);
}
(2)自定義樣式
此外需要說明的是,也可以傳入style,這里傳入style的處理方式和之前不同:
首先需要導入按鍵圖片,也就是可選項的哪個白色小圈。傳入的圖片可能過大,單獨修改圖片大小而不碰字體,需要修改:
才會只修改圖片的大小,將寬高均修改為20后:
接下來需要單獨移動字體而不動圖片,需要修改:
修改完成后:
接下來需要修改點擊時圖片變化,需要在on Normal中傳入圖片。
再修改一下漢字顏色和字體,自定義樣式就完成了:
2、單選框
單選框的實現是基于多選框的。只需要實現,當一個按鈕按下后亮起,其他按鈕都自動取消按下就可以,可以通過以下代碼邏輯實現:
private int nowSelIndex = 1;
private void OnGUI()
{if(GUI.Toggle(new Rect(0, 80, 100, 30), nowSelIndex == 1, "選項一")){nowSelIndex = 1;}else if(GUI.Toggle(new Rect(0, 120, 100, 30), nowSelIndex == 2, "選項二")){nowSelIndex = 2;}else if(GUI.Toggle(new Rect(0, 160, 100, 30), nowSelIndex == 3, "選項三")){nowSelIndex = 3;}
}
三、輸入框和拖動條
1、輸入框
(1)普通輸入
普通的輸入框使用的API是:GUI.TextField(),里面必須要傳入的參數有兩個:位置信息和顯示信息。位置信息表示的是輸入框的位置,為Rect類型,顯示信息是輸入框中顯示的內容,為string類型。
同之前一樣,顯示的內容需要實時返回,因此與之前一樣,我們可以設置一個變量表示顯示信息,第二個參數傳入這個變量,GUI.TextField()的返回值也是這個變量接收,這樣就可以保證顯示信息實時變化。
可以再傳入第三個參數,表示最大長度,例如當設置為5時,最多輸入5個字符。也可以繼續傳入輸入框樣式等。
private string inputStr;private void OnGUI()
{inputStr = GUI.TextField(new Rect(0, 0, 100, 30), inputStr,5);
}
(2)密碼輸入
密碼輸入框使用的API是:GUI.PasswordField,里面必須要傳入的參數有三個:位置信息、顯示信息、密碼的覆蓋字符。位置信息表示的是輸入框的位置,為Rect類型,顯示信息是輸入框中顯示的內容,為string類型。覆蓋字符自己可選,例如可以傳入字符‘*’,用戶輸入的內容就會自動變為*
同之前一樣,顯示的內容需要實時返回,不再解釋,同樣可以再傳入第四個參數,表示最大長度。
private string inputPW;private void OnGUI()
{inputPW = GUI.PasswordField(new Rect(0, 50, 100, 30), inputPW, '*');
}
2、拖動條?
(1)水平拖動條
水平拖動條使用的API是:GUI.HorizontalSlider(),里面必須要傳入的參數有四個:位置信息、當前值、最小值、最大值。位置信息表示的是輸入框的位置,為Rect類型,當前值是當前拖動條所處的位置,最小值是拖動條最小數值,最大值是拖動條最大數值。
同之前一樣,當前值需要實時返回,不再解釋,同樣可以繼續傳入樣式信息,這里不演示。
private float nowValue = 0.5f;private void OnGUI()
{nowValue = GUI.HorizontalSlider(new Rect(0, 100, 100, 50), nowValue, 0, 1);
}
(2)豎直拖動條
豎直拖動條使用的API是:GUI.VerticalSlider(),除了顯示的拖動條是豎向的,其余用法與水平拖動條沒有區別
private float nowValue = 0.5f;private void OnGUI()
{nowValue = GUI.VerticalSlider(new Rect(0, 150, 50, 100), nowValue, 0, 1);
}
四、圖片繪制和框
1、圖片繪制
繪制圖片使用的API是:GUI.DrawTexture(),其中必須要傳入的參數有兩個:圖片的位置信息和顯示的圖片。圖片位置信息是Rect型,圖片為Texture型。
此外,還有三個較為重要的參數:
1、ScaleMode,有三種:
? ? ScaleToFit:自動根據寬高比進行計算,不會拉變形,會一直保持圖片完全顯示的狀態
ScaleAndCrop:也會通過寬高比來進行計算 但是會裁剪
StretchToFill:始終填充滿你傳入的Rect范圍
2、alpha:控制圖片是否開啟透明通道,默認為true開啟,false不開啟
3、imageAspect:自定義寬高比,如果不填默認為0,就會使用圖片原始寬高
public Rect texPos;
public Texture tex;
public ScaleMode mode = ScaleMode.StretchToFill;
public bool alpha = true;
public float wh = 0;private void OnGUI()
{GUI.DrawTexture(texPos, tex, mode, alpha, wh);
}
如果alpha為false:
alpha為true:
2、框繪制
框繪制用的比較少,使用API:GUI.Box(),必須傳入位置信息,顯示信息,顯示信息可以為空。也可以傳入可選參數樣式等。
public Rect texPos;private void OnGUI()
{GUI.Box(texPos, "");
}