美文网首页Unity 碎片知识
三步搞定Unity异步加载场景

三步搞定Unity异步加载场景

作者: WithStream | 来源:发表于2019-01-15 16:06 被阅读0次

           加载场景的功能想必在游戏开发中是十分常见的了。如果想从一个场景过渡到另一个包含资源较多的场景,必然需要等待一段时间,这时候就需要有一个滑动条来动态显示加载进度了。本案例提到三个场景:A(原始的场景)、B(加载场景)和C(想要切换到的场景)。当然,很多时候B场景是和A场景是合并的。


    1.先写一个全局类,记录当前要切换场景的名称

    public class Globe

    {

        public static string loadName;

    }


    2.在A场景中,执行如下脚本后,会瞬间过渡到B场景:

    public class A : MonoBehaviour

    {

        void Start()

        {

            Globe.loadName = "C";                  //记录Loading场景中 需要异步加载的场景名称

            SceneManager.LoadScene("B");   //进入B场景

        }

    }


    3.在B场景中,应该有进度条、进度百分比等UI,同时也可以配上自定义的动画。

    该场景自动运行以下脚本:

    public class AsyncLoadScene : MonoBehaviour

    {

        public Slider loadingSlider;     //显示进度的滑动条

        public Text loadingText;          //显示进度的文本

        public string SceneName;     

        private float loadingSpeed = 1;

        private float targetValue;

        private AsyncOperation async;

        private void Start()

        {

            loadingSlider.value = 0.0f;

            StartCoroutine(AsyncLoading());

        }

        IEnumerator AsyncLoading()

        {

            //异步加载场景

            async = SceneManager.LoadSceneAsync(Globe.nextSceneName);   

            //阻止当加载完成自动切换

            async.allowSceneActivation = false;      

            //读取完毕后返回,系统会自动进入C场景

            yield return async;      

        }

        void Update()

        {

            if (async == null) { return; }

            targetValue = async.progress;

            if (async.progress >= 0.9f)

            {

                //值最大为0.9

                targetValue = 1.0f;

            }

            //为滑动条赋值

            if (targetValue != loadingSlider.value)

            {

                loadingSlider.value = Mathf.Lerp(loadingSlider.value, targetValue, Time.deltaTime * loadingSpeed);

                if (Mathf.Abs(loadingSlider.value - targetValue) < 0.01f)

                {

                    loadingSlider.value = targetValue;

                }

            }

            loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%";

            if ((int)(loadingSlider.value * 100) == 100)

            {

                //允许异步加载完毕后自动切换场景

                async.allowSceneActivation = true;

            }

        }

    }

    相关文章

      网友评论

        本文标题:三步搞定Unity异步加载场景

        本文链接:https://www.haomeiwen.com/subject/tleydqtx.html