当前位置:   article > 正文

Unity中,在按钮的处理事件中,显示UI(Panel)的一些问题_unity点击物体出现ui界面

unity点击物体出现ui界面

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

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

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

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

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

如下

  1. public void ButtonOnClickEvent(){
  2. panel.SetActive(true);
  3. ProcessButton(); //事件处理函数
  4. .....//将panel的信息更新为加载完成
  5. }

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

原因是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判断是否需要处理。实现如下:

  1. bool state=false;
  2. public void ButtonOnClickEvent(){
  3. panel.SetActive(true);//提前配置好加载中的panel
  4. state=true;
  5. }
  6. void FixedUpdate(){
  7. if(state)
  8. {
  9. ProcessButton();
  10. state=false;//记得把state置回false
  11. }
  12. }
  13. void ProcessButton(){
  14. ......//事件具体处理
  15. ......//将panel的信息更新为加载完成,这里要注意,需要在panel中添加一个Button
  16. //该按钮控制将panel隐藏
  17. }

 效果如图

 

 

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号