從老版本界面onGUI--->到GUI插件NGUI-->再到新版本界面UGUI.隨着版本的更新,UI界面的設置也各不相同,現在公司比較常用的也就是UGUI了,那么我們要怎么去快速的使用UGUI去實現功能呢?UGUI系統是從Unity4.6開始被集成到Unity編譯器中的。Unity官方給這個新的UI系統賦予的標簽是:靈活,快速和可視化。對於開發者而言,就是有三個優點:效率高效果好,易於使用和擴展以及與Unity的兼容性高。新的UGUI系統具有以下特點:
1. 引擎內置,結合更加緊密
2. 運行穩定,操作方便
UGUI與老版本onGUI相比:
1. 獨立的坐標體系
2. 全新的事件機制
3. 更佳高效率的運轉效率
一.在我們接觸UGUI的時候,首先肯定會先接觸一些UGUI的一些組件,因為只有我們先了解了這些組件,我們才知道如何去應用它,如何去用腳本編輯它
從這里我們可以看到UI有這些個插件.具體怎么去使用呢!大家還是要親手體會下才能更加的深入體會它的用處!好的,這里我們主要講的是框架!
二.UI框架
1.我們寫框架時,要確保它能夠在這個游戲里,能夠在多個不同的地方出現,像一般的方法是不行的,這時候我們就會采用單例來實現這個功能.首先我們先寫一個單例
public class UIManager : MonoBehaviour {
static UIManager instance;
public static UIManager Instance
{
get
{
return instance;
}
}
private void Awake()
{
instance = this;
}//這就是一個單例了;
2.為了能夠更好的存儲我們的對象,我們會在這里采用字典dictionary來存放我們的界面(預設體);
Dictionary<string,GameObject>UIobjDice=new Dictionary<string,GameObject>();
string prefabDIR="prefab"//用來獲取預設體文件的名
void AddUIprefabByName(string UIName)//根據名字加載預設體,並保存在字典當中
{
if (UIobjDice.ContainsKey(UIName))//判斷是否存在,不存在就加載
{
return;
}
string path = prefabDIR + "/" + UIName;//構建一條路徑
GameObject uiObj = Resources.Load<GameObject>(path);//加載的路徑
if(uiObj != null)
{
UIobjDice.Add(UIName, uiObj);//添加
}
}
3.用我們的字典存儲好了預設體后,我們還要給預設體添加腳本,而第一個腳本呢,就做為我們所有預設體的父類,父類還是繼承於MonoBehaviour的,之后我們再創建一個就做為預設體的腳本了,這個腳本就繼承於我們的UIBase了,在父類這個腳本當中我們會添加四個方法,這四個方法必須是該預設體全都得使用的,也就是用虛方法來表示.從四個方法中我們可以看到用戶進入屏幕當中,用戶界面停止,用戶界面回到屏幕當中,和用戶界面銷毀的時候.這四個方法.
----------------------------------------------------------------------------
父類腳本
public class UIBase : MonoBehaviour {//
public virtual void UserInterfaceEnter()//用戶界面第一次進入屏幕當中的時候調用
{
}
public virtual void UserInterfacePause()//用戶界面在當前屏幕停止(被切換)的時候調用
{
}
public virtual void UserInterfaceResume()//用戶界面重新回到屏幕當中
{
}
public virtual void UserInterfaceExit()//用戶界面銷毀的時候
{
}
---------------------------------------------------------------------------------
預設體腳本
public class UIoptionScript : UIBase { //在這里我們是繼承UIBase的
public override void UserInterfaceEnter()//用戶界面第一次進入屏幕當中的時候調用
{
GetComponent<Canvas>().worldCamera = Camera.main; //獲取攝像機
gameObject.SetActive(true);
}
public override void UserInterfaceExit()//用戶界面銷毀的時候
{
gameObject.SetActive(false);
}
public override void UserInterfacePause()//用戶界面在當前屏幕停止(被切換)的時候調用
{
gameObject.SetActive(false);
}
public override void UserInterfaceResume()//用戶界面重新回到屏幕當中
{
gameObject.SetActive(true);
}
4.我們的存儲了我們的對象之后我們還要去加載我們對對象腳本,我們在這里還是采用字典Dictionary去存放,
Dictionary<string, UIBase> currentUIdict = new Dictionary<string, UIBase>();
//通過預設體實例化游戲對象:保存的是游戲對象身上UIBASE類型的腳本,通過這個腳本就可以操作游戲對象
public UIBase INstantiteUIBYName(string UIname)
{
//判斷當前加載的這個東西之前有沒有加載過(是否保存在 currentUIdict里面)
if ( currentUIdict.ContainsKey (UIname))
{
return currentUIdict[UIname];
}
//如果不存在則實例化(true)
GameObject objPerfab = UIobjDice[UIname];//取出預設體
GameObject obj= GameObject.Instantiate(objPerfab);//根據預設體進行實例化
UIBase uibase = obj.GetComponent<UIBase>();//預設體獲取腳本
currentUIdict.Add(UIname, uibase);//加載一個界面之后將界面的腳本保存下來
obj.name = UIname;//獲取腳本的名字
return uibase;
}
5.我們玩游戲時,是不是經常一個界面界面的切換,為了能夠更好的控制界面的先后關系,在這里我們設置一個棧用來保存輪機屏幕的先后關系;
* peek:將對象插入stack頂部(入棧操作)
* pop:移除並返回stack頂部(出棧操作)
Stack<UIBase> UIstack = new Stack<UIBase>();//棧
//界面入棧(讓界面顯示出來)
public void pushUserInterface(string UIname)
{
if(UIstack .Count > 0)//如果這個棧的數量大於0
{
UIBase oldUI = UIstack.Peek();//棧頂的界面要停止了,隱藏下去
oldUI.UserInterfacePause();//獲取用戶界面在當前屏幕停止(被切換)的時候調用的方法
}
UIBase newUI = INstantiteUIBYName(UIname);//通過名字來獲取一個新的界面
UIstack.Push(newUI);//新的界面壓入棧中
newUI.UserInterfaceEnter();//調用其登場的方法
}
//界面出棧(讓界面消失)
public void poPuserInterface()
{
UIBase oldUI= UIstack.Pop();//棧頂的界面調用其退出的方法
oldUI.UserInterfaceExit();//獲取用戶銷毀的方法
if(UIstack.Count > 0)//如果棧中還有界面的話要讓它重新顯示出來
{
UIBase newui = UIstack.Peek();
newui.UserInterfaceResume();//用戶重新回到屏幕當中
}
}
6.我們有了游戲界面后,我們還得有游戲的聲音,在這里我們設置下,和上面的框架有點相同
public class AudioManage : MonoBehaviour {
public static AudioManage instance;//單例
public static AudioManage Instance
{
get
{
return instance;
}
}
string audioDir = "Audios";
Dictionary<string, AudioClip> AllcBGNDict = new Dictionary<string, AudioClip>();
AudioSource audioSource;//當前播放的音頻
void Awake()
{
instance = this;
audioSource = GetComponent<AudioSource>();//獲取音頻播放器組件
//設置
audioSource.playOnAwake= true;//開始時播放
audioSource.loop = true;//播放循環
}
public void playBGM(string ACName)//播放一個背景音樂
{
AudioClip ac;
if (AllcBGNDict.ContainsKey(ACName))//判斷這首音樂是否已經加載到內存當中,是的話就獲取出來
{
ac = AllcBGNDict[ACName];
}
else//不是的話就從資源文件夾當中加載
{
//構建路徑
string pate = audioDir + "/" + ACName;
ac= Resources.Load<AudioClip>(pate);
AllcBGNDict.Add(ACName, ac);
}
audioSource.clip = ac;
audioSource.Play();
}
public void StopBgM()//停止播放背景音樂
{
audioSource.Stop ();
}
public void ResumeBGM()//開始播放背景音樂
{
audioSource.Play();
}
6.在游戲開始時我們要設置她先顯現哪個畫面或者是音樂,然后通過這個畫面的按鍵又去實現什么功能,
UIManager.Instance.pushUserInterface("UIstart");//加載的預設體名
AudioManage.instance.playBGM("c");//加載的音樂歌名
7.在這一步主要是教我們怎么去實現通過按鍵,當你按下的時候跳出別一個畫面上去,這里我們通過按鍵的監聽事件,,去加載我們預設體中的方法

框架的大概意思就是這樣了,它是通過腳本中的方法去完成界面控件的每一個功能,而不是直接在我們的Unity中設置
