Unity中,在按钮的处理事件中,显示UI(Panel)的一些问题

问题来源(自己遇到的):

(32条消息) Unity SetActive(True)滞后严重-游戏-CSDN问答

简单概括就是,点击按钮,开始处理某个事件,这个事件需要花费较长时间,我的想法是加入一个加载中界面,方便告知用户当前程序没有卡住。在完成事件后,提示加载完成。

首先,为按钮添加监听事件

我最开始是在上图的ButtonOnClickEvent中使用panel.Setactive(true);来启用加载界面,该语句之后进行真正的按钮处理事件,处理完成之后,改变panel中text的值显示已完成,再Setactive(false)关闭panel。

如下

public void ButtonOnClickEvent(){
panel.SetActive(true);
ProcessButton(); //事件处理函数

.....//将panel的信息更新为加载完成
}

但我发现,点下按钮之后并不会弹出加载中界面,而是卡住,等待按钮处理事件结束之后,直接弹出了加载完成界面,加载中界面直接被跳过了。

原因是Unity的UI渲染次序,一个按钮的处理事件Unity是放在一个帧中的,所以等整个ButtonOnClickEvent处理结束,才会渲染UI。所以我们没有看到加载中的界面,而是直接看到了加载完成,是因为最后显示的是已经被更新的panel。

明白这个后,我们需要知道Unity的函数执行顺序,如图(Unity手册事件函数的执行顺序 - Unity 手册

在这里插入图片描述

 可以看到如果把SetActive(true)放到ButtonOnClickEvent中,那么我们就只能看到加载完成。因为在WaitForEndOfFrame前,OnGUI是最后执行的。所以我的思路是,在下一帧的开始进行事件处理,也就是在FixedUpdate中完成事件处理。

我们可以在ButtonOnClickEvent中添加一个状态变量 state,代表需要处理事件,在ButtonOnClickEvent的最后,我们将state置为True,然后显示UI,这样ButtonOnClickEvent中只完成两件事情,显示加载中界面,将state置为true。然后在下一帧的FixedUpdate中,根据state判断是否需要处理。实现如下:

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隐藏
}

 效果如图

 

 

以上,是我的解决方案,刚学Unity,不是很懂,解决方案不唯一,仅供参考。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>