当前位置:   article > 正文

Unity异步加载一个场景_unity异步加载场景

unity异步加载场景

属性(AsyncOperation)

方法名

简介

allowSceneActivation自动加载下个场景
isDone是否加载好场景
progress

数值是从0到1  显示加载场景的进程

如果allowSceneActivation是false,则最高到0.9

  • 思路(需要协程)
  • 创建AsyncOperation类的变量用来获取下个场景
  • 将allowSceneActivation设置为false
  • 在每帧中检测isDone
  • 没加载好就将progress的值赋值给slider的value,因为progress的值是0-1的所以可以直接赋值给value
  • 显示百分比直接将progress的值 * 100就可以
  • 判断是否加载完成如果progress是0.9就代表加载完成了,因为我们上面设置了allowSceneActivation为false所以不会自动跳转需要再将值设置为true才会跳转
     

  1. /// <summary>
  2. /// 异步加载场景的实现
  3. /// </summary>
  4. /// <returns></returns>
  5. protected virtual IEnumerator AsyncLoad(bool loadPanel)
  6. {
  7. AsyncOperation operation;
  8. //获取异步A程序走完 要进入的下个场景B.获取异步走完B场景 A(异步)-->B(场景)
  9. operation = SceneManager.LoadSceneAsync(sceneName);
  10. //判断是否开启异步
  11. if (loadPanel)
  12. {
  13. //查找加载异步A的对象
  14. GameObject panel = GameObject.Find(LoadPanelName);
  15. if (panel == null)
  16. {
  17. Debug.LogError($"{LoadPanelName}面板不存在");
  18. yield break;
  19. }
  20. //开启面板进度条
  21. panel.transform.PanelAppearance(true);
  22. // 设置下一个场景为false
  23. operation.allowSceneActivation = false;
  24. //获取面板面板进度条
  25. Slider slider = panel.GetComponentInChildren<Slider>();
  26. //进度条起始值为0
  27. slider.value = 0;
  28. float progressValue;
  29. // 是否加载好场景 true加载好 false未加载好(让走循环)
  30. while (!operation.isDone)
  31. {
  32. //加载场景进度小于1把当前值赋值。
  33. if (operation.progress < 0.9f)
  34. progressValue = operation.progress;
  35. else
  36. //加载场景进度 >1加载完成 赋值为1
  37. progressValue = 1.0f;
  38. //赋值给进度条
  39. slider.value = progressValue;
  40. //进度值大于1
  41. if (progressValue >= 0.9f)
  42. {
  43. slider.value = 1f;
  44. //设置下一个场景为true
  45. operation.allowSceneActivation = true;
  46. }
  47. yield return null;
  48. }
  49. //把当前进度条面板进行隐藏
  50. panel.transform.PanelAppearance(false);
  51. }
  52. else
  53. operation.allowSceneActivation = true;
  54. }
  55. }
  56. /// <summary>
  57. /// 控制一个面板的外观
  58. /// </summary>
  59. /// <param name="t"></param>
  60. /// <param name="on_off">显示则为true</param>
  61. /// <param name="active">是否为活动对象</param>
  62. public static void PanelAppearance(this Transform t, bool on_off, bool active = false)
  63. {
  64. CanvasGroup group = t.GetOrAddComponent<CanvasGroup>();
  65. int value = on_off == true ? 1 : 0;
  66. //射线检测
  67. group.blocksRaycasts = on_off;
  68. //交互
  69. group.interactable = on_off;
  70. //透明度
  71. group.alpha = value;
  72. t.gameObject.SetActive(on_off || active);
  73. }
  74. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号