【Unity3d】浅谈异步加载场景

大家好,我是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 initialization
	void 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 frame
	void 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的时候可以控制异步加载的场景暂时不进入)。

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





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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值