大家好,我是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的时候可以控制异步加载的场景暂时不进入)。
好了,下面让我们来看一下运行的效果
今天的分享就到此结束了,欢迎大家一起来探讨,本人的代码规范写的很烂,有更好的写法欢迎指出。