問題來源(自己遇到的):
(32條消息) Unity SetActive(True)滯后嚴(yán)重-游戲-CSDN問答
簡單概括就是,點(diǎn)擊按鈕,開始處理某個事件,這個事件需要花費(fèi)較長時間,我的想法是加入一個加載中界面,方便告知用戶當(dāng)前程序沒有卡住。在完成事件后,提示加載完成。
首先,為按鈕添加監(jiān)聽事件
我最開始是在上圖的ButtonOnClickEvent中使用panel.Setactive(true);來啟用加載界面,該語句之后進(jìn)行真正的按鈕處理事件,處理完成之后,改變panel中text的值顯示已完成,再Setactive(false)關(guān)閉panel。
如下
public void ButtonOnClickEvent(){
panel.SetActive(true);
ProcessButton(); //事件處理函數(shù)
.....//將panel的信息更新為加載完成
}
但我發(fā)現(xiàn),點(diǎn)下按鈕之后并不會彈出加載中界面,而是卡住,等待按鈕處理事件結(jié)束之后,直接彈出了加載完成界面,加載中界面直接被跳過了。
原因是Unity的UI渲染次序,一個按鈕的處理事件Unity是放在一個幀中的,所以等整個ButtonOnClickEvent處理結(jié)束,才會渲染UI。所以我們沒有看到加載中的界面,而是直接看到了加載完成,是因?yàn)樽詈箫@示的是已經(jīng)被更新的panel。
明白這個后,我們需要知道Unity的函數(shù)執(zhí)行順序,如圖(Unity手冊事件函數(shù)的執(zhí)行順序 - Unity 手冊)
?可以看到如果把SetActive(true)放到ButtonOnClickEvent中,那么我們就只能看到加載完成。因?yàn)樵赪aitForEndOfFrame前,OnGUI是最后執(zhí)行的。所以我的思路是,在下一幀的開始進(jìn)行事件處理,也就是在FixedUpdate中完成事件處理。
我們可以在ButtonOnClickEvent中添加一個狀態(tài)變量 state,代表需要處理事件,在ButtonOnClickEvent的最后,我們將state置為True,然后顯示UI,這樣ButtonOnClickEvent中只完成兩件事情,顯示加載中界面,將state置為true。然后在下一幀的FixedUpdate中,根據(jù)state判斷是否需要處理。實(shí)現(xiàn)如下:
bool state=false;
public void ButtonOnClickEvent(){
panel.SetActive(true);//提前配置好加載中的panel
state=true;
}
void FixedUpdate(){
if(state)
{
ProcessButton();
state=false;//記得把state置回false
}
}
void ProcessButton(){
......//事件具體處理
......//將panel的信息更新為加載完成,這里要注意,需要在panel中添加一個Button
//該按鈕控制將panel隱藏
}
?效果如圖
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-776563.html
以上,是我的解決方案,剛學(xué)Unity,不是很懂,解決方案不唯一,僅供參考。文章來源地址http://www.zghlxwxcb.cn/news/detail-776563.html
到了這里,關(guān)于Unity中,在按鈕的處理事件中,顯示UI(Panel)的一些問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!