当前位置:   article > 正文

Unity_加载页面及进度条_unity单独的加载页

unity单独的加载页

就是其他主页点击按钮后先跳转到这个加载页面场景, 同时异步加载要跳转到的场景

参考:Unity SceneManager场景管理Chinar详解API

Unity 场景异步加载(加载界面的实现)


新建一个加载页面场景

创建一个滑动条用来表示进度条

 

再创建一个文本用来显示进度百分比

 位置随便摆一下

创建一个空对象

在空对象上新建挂载脚本

 

修改代码:

  1. /*加载场景页面*/
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. using UnityEngine.SceneManagement;//场景管理
  7. public class Load_test : MonoBehaviour
  8. {
  9. // Start is called before the first frame update
  10. void Start()
  11. {
  12. LoadNextLeaver();//开启协程(多线程?)
  13. }
  14. // Update is called once per frame
  15. void Update()
  16. {
  17. }
  18. public GameObject image; //加载界面
  19. public Slider slider; //进度条
  20. public Text text; //加载进度文本
  21. public void LoadNextLeaver()
  22. {
  23. image.SetActive(true);
  24. StartCoroutine(LoadLeaver());
  25. }
  26. IEnumerator LoadLeaver()
  27. {
  28. AsyncOperation operation = SceneManager.LoadSceneAsync(2); //准备加载序号为2的场景
  29. operation.allowSceneActivation = true;//加载完成后,是否允许场景跳转
  30. while (!operation.isDone) //当场景没有加载完毕
  31. {
  32. slider.value = operation.progress; //进度条与场景加载进度对应
  33. text.text = (operation.progress * 100).ToString() + "%";
  34. yield return null;
  35. }
  36. }
  37. }

 运行测试,可以实现跳转和进度条


但目标场景太小了,瞬间闪一下就加载完了,就很出戏 

一个伪加载实现:

参考:Unity协程实现伪加载页面

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class Load_test_ : MonoBehaviour
  6. {
  7. // Start is called before the first frame update
  8. void Start()
  9. {
  10. }
  11. // Update is called once per frame
  12. //void Update()
  13. //{
  14. //}
  15. /// <summary>
  16. /// 进度条下方显示的文本
  17. /// </summary>
  18. [SerializeField]
  19. Text Aegis_text;
  20. /// <summary>
  21. /// 进度条
  22. /// </summary>
  23. [SerializeField]
  24. Slider slider;
  25. /// <summary>
  26. /// 文字后方点数显示
  27. /// </summary>
  28. float pointCount;
  29. /// <summary>
  30. /// 当前进度
  31. /// </summary>
  32. float progress = 0;
  33. /// <summary>
  34. /// 进度条读取完成时间
  35. /// </summary>
  36. float total_time = 3f;
  37. /// <summary>
  38. /// 计时器
  39. /// </summary>
  40. float time = 0;
  41. void OnEnable()
  42. {
  43. //开启协程
  44. StartCoroutine("AegisAnimation");
  45. }
  46. void Update()
  47. {
  48. //记录时间增量
  49. time += Time.deltaTime;
  50. //当前进度随着时间改变的百分比
  51. progress = time / total_time;
  52. if (progress >= 1)
  53. {
  54. UnityEngine.SceneManagement.SceneManager.LoadScene(2);//假装的加载完成后,还是要跳转到目标场景
  55. return;
  56. }
  57. //把进度赋给进度条的值
  58. slider.value = progress;
  59. }
  60. void OnDisable()
  61. {
  62. //关闭协程
  63. StopCoroutine("AegisAnimation");
  64. }
  65. /// <summary>
  66. /// 文本显示协程
  67. /// </summary>
  68. /// <returns></returns>
  69. IEnumerator AegisAnimation()
  70. {
  71. while (true)
  72. {
  73. yield return new WaitForSeconds(0.1f);
  74. float f = slider.value;
  75. //设置进度条的value值在某个区间的时候要显示的字符串
  76. string reminder = "";
  77. if (f < 0.25f)
  78. {
  79. reminder = "检测余额中...";
  80. }
  81. else if (f < 0.5f)
  82. {
  83. reminder = "注入木马中...";
  84. }
  85. else if (f < 0.75f)
  86. {
  87. reminder = "破解密码中...";
  88. }
  89. else
  90. {
  91. reminder = "上传数据中...";
  92. }
  93. //显示字符串后面的“.”
  94. pointCount++;
  95. if (pointCount == 7)
  96. {
  97. pointCount = 0;
  98. }
  99. for (int i = 0; i < pointCount; i++)
  100. {
  101. reminder += ".";
  102. }
  103. //把显示内容赋给场景中的text
  104. Aegis_text.text = reminder;
  105. }
  106. }
  107. }

测试效果

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/111748
推荐阅读
相关标签
  

闽ICP备14008679号