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才会跳转
     


        /// <summary>
        /// 异步加载场景的实现
        /// </summary>
        /// <returns></returns>
        protected virtual IEnumerator AsyncLoad(bool loadPanel)
        {
            AsyncOperation operation;

            //获取异步A程序走完 要进入的下个场景B.获取异步走完B场景      A(异步)-->B(场景)
            operation = SceneManager.LoadSceneAsync(sceneName);

            //判断是否开启异步
            if (loadPanel)
            {

                //查找加载异步A的对象
                GameObject panel = GameObject.Find(LoadPanelName);
                if (panel == null)
                {
                    Debug.LogError($"{LoadPanelName}面板不存在");
                    yield break;
                }
                //开启面板进度条
                panel.transform.PanelAppearance(true);
                //  设置下一个场景为false
                operation.allowSceneActivation = false;
                //获取面板面板进度条
                Slider slider = panel.GetComponentInChildren<Slider>();
                //进度条起始值为0
                slider.value = 0;
                float progressValue;

                //	是否加载好场景  true加载好  false未加载好(让走循环)
                while (!operation.isDone)
                {
                    //加载场景进度小于1把当前值赋值。 
                    if (operation.progress < 0.9f)
                        progressValue = operation.progress;
                    else
                        //加载场景进度 >1加载完成  赋值为1
                        progressValue = 1.0f;

                    //赋值给进度条
                    slider.value = progressValue;
                    //进度值大于1
                    if (progressValue >= 0.9f)
                    {   
                        slider.value = 1f;
                        //设置下一个场景为true
                        operation.allowSceneActivation = true;
                    }
                    yield return null;
                }
                //把当前进度条面板进行隐藏
                panel.transform.PanelAppearance(false);
            }
            else
                operation.allowSceneActivation = true;
        }
    }



  /// <summary>
        /// 控制一个面板的外观
        /// </summary>
        /// <param name="t"></param>
        /// <param name="on_off">显示则为true</param>
        /// <param name="active">是否为活动对象</param>
        public static void PanelAppearance(this Transform t, bool on_off, bool active = false)
        {
            CanvasGroup group = t.GetOrAddComponent<CanvasGroup>();
            int value = on_off == true ? 1 : 0;

            //射线检测
            group.blocksRaycasts = on_off;
            //交互
            group.interactable = on_off;
            //透明度
            group.alpha = value;

            t.gameObject.SetActive(on_off || active);
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_38092788/article/details/132188417
今日推荐