【Unity3d】浅谈异步加载场景

来源:互联网 发布:c语言入门经典 编辑:程序博客网 时间:2024/04/30 21:06

大家好,我是sakai,这是我的第一篇分享心得博客,以后我会陆续总结自己学习U3D的经验,希望能和大家一起交流共同进步。  

我们玩很多游戏,在加载切换场景的时候往往需要载入很多的资源,因此需要加载比较长的时间,为了有更好的玩家交互,让玩家可以在等待加载的同时也不会觉得无聊,就需要一个好的缓冲过程了。这时候我们用到的就是异步加载。在加载的时候我们可以通过各种各样的方式给玩家一种“假象”,让玩家可以知道游戏的加载进度。很多rpg游戏用的是滑动器+tips标签页来显示,今天我就给大家介绍一下我的使用心得,废话不多说,下面贴代码。

<pre name="code" class="csharp">using System;using UnityEngine;using System.Collections;using UnityEngine.UI;using Random = UnityEngine.Random;public class Loading : MonoBehaviour {    //异步对象      private AsyncOperation _asyncOperation;    //显示tips的文本    private Text _tip;    //tips的集合    private string[] _tips = new string[]    {        "坂井泉水",        "上野树里",        "长泽雅美",        "户田惠梨香"    };    //更新tips的时间间隔    private const float _updateTime = 1f;    //上次更新的时间    private float _lastUpdateTime = 0;    //滑动条    private Slider _slider;    //显示进度的文本    private Text _progress;// Use this for initializationvoid Start (){    _tip = GameObject.Find("Text").GetComponent<Text>();    _slider = GameObject.Find("Slider").GetComponent<Slider>();    _progress = GameObject.Find("Progress").GetComponent<Text>();            SetTip();    StartCoroutine(LoadAsync("NextScene"));}// Update is called once per framevoid Update ()    {        //首先判断是否为空,其次判断是否加载完毕        if (_asyncOperation != null && !_asyncOperation.allowSceneActivation)        {            //开始更新tips            if (Time.time - _lastUpdateTime >= _updateTime)            {                _lastUpdateTime = Time.time;                SetTip();            }        }}    /// <summary>    /// 设置加载标签    /// </summary>    private void SetTip()    {        int temp = Random.Range(0, _tips.Length);        _tip.text = _tips[temp];    }    /// <summary>    /// 携程进行异步加载场景    /// </summary>    /// <param name="sceneName">需要加载的场景名</param>    /// <returns></returns>    IEnumerator LoadAsync(string sceneName)    {        //当前进度        int currentProgress = 0;        //目标进度        int targetProgress = 0;       _asyncOperation = Application.LoadLevelAsync(sceneName);        //unity 加载90%        _asyncOperation.allowSceneActivation = false;        while (_asyncOperation.progress<0.9f)        {            targetProgress = (int) _asyncOperation.progress*100;            //平滑过渡            while (currentProgress<targetProgress)            {                ++currentProgress;                _progress.text= String.Format("{0}{1}",currentProgress.ToString(),"%");                _slider.value = (float) currentProgress/100;                yield return new WaitForEndOfFrame();            }        }        //自行加载剩余的10%        targetProgress = 100;        while (currentProgress < targetProgress)        {            ++currentProgress;            _progress.text = String.Format("{0}{1}", currentProgress.ToString(), "%");            _slider.value = (float)currentProgress / 100;            yield return new WaitForEndOfFrame();        }        _asyncOperation.allowSceneActivation = true;    }}



本文的核心部分在于第二个携程LoadAsync部分,我使用的是Unity自带的方法Application.LoadLevelAsync,由于progress在加载到0.9的时候会停止加载,所以在0.9-1的过渡需要我们自己手动执行。在这里还需要提一下的就是,我使用了allowSceneActivation这个标志位来区分是否异步加载完毕(false的时候可以控制异步加载的场景暂时不进入)。

好了,下面让我们来看一下运行的效果





今天的分享就到此结束了,欢迎大家一起来探讨,本人的代码规范写的很烂,有更好的写法欢迎指出。

0 0
原创粉丝点击