loading界面是我们做游戏的时候经常用的,loading界面里元素很少,只是用于过渡,在加载比较大的场景的时候使用,比如从A场景到C场景,因为C场景较大,先进入B场景,在B场景异步加载C场景,加载完成后进入C,这样做的好处就是告诉用户:游戏并没有卡死,耐心等待一会,通常loading界面都有一个进度条,读条完成后进入C场景。
那么和AssetBundle有什么关系呢?因为loading在异步加载C场景之前,可以先进行AssetBundle加载,也就是先加载离线资源包然后加载场景。因为这两个过程都是异步加载,放在一起十分完美。类似下面这样:
先简单介绍一下Loading场景的结构。loading比较简单,一般只绑定一条脚本,脚本中首先Start中加入携程函数,开启一个异步任务。
void Start()
{
//在这里开启一个异步任务,进入loadScene方法。
StartCoroutine(loadScene());
}
其中异步任务代码如下:
IEnumerator loadScene()
{
//加上这么一句就可以先显示加载画面然后再进行加载
yield return new WaitForEndOfFrame();
string path = "http://songshizhao.com/apps/AppData/rockhero/android/StreamingAssets/";
#if UNITY_ANDROID
path = "http://songshizhao.com/apps/AppData/rockhero/android/StreamingAssets/";
#endif
#if UNITY_IPHONE
path = "http://songshizhao.com/apps/AppData/rockhero/windows/StreamingAssets/";
#endif
#if UNITY_STANDALONE_WIN
path = "http://songshizhao.com/apps/AppData/rockhero/windows/StreamingAssets/";
#endif
path = path+ sceneLoad.BundleName[musicIndex]+ "."+ sceneLoad.BundleVarient[musicIndex];
WWW www = WWW.LoadFromCacheOrDownload(path, 0);
//等待下载完成
yield return www;
if (www.error != null)
{
//警告
Debug.Log(www.error);
yield break;
}
else
{
int musicindex = PlayerPrefs.GetInt("MusicIndex");
//Debug.Log("打开的歌曲序号是"+ musicindex);
//Debug.Log("打开的歌曲资源名字是" + sceneLoad.AssetName[musicIndex]);
//Debug.Log("打开的歌曲显示名字是" + sceneLoad.songs[musicIndex]);
//从bytes数组中创建AssetBundle
AssetBundle assetBundle = www.assetBundle;
AssetBundleRequest request = assetBundle.LoadAssetAsync(sceneLoad.AssetName[musicIndex], typeof(AudioClip));
musics[musicIndex] = request.asset as AudioClip;
AssetBundleRequest request2 = assetBundle.LoadAssetAsync(sceneLoad.AssetName[musicIndex], typeof(TextAsset));
docs[musicIndex] = request2.asset as TextAsset;
assetBundle.Unload(false);
}
async = SceneManager.LoadSceneAsync("myf");
async.allowSceneActivation = false;//防止90%跳入场景
}
上面的代码只有第一句和最后两句是异步加载场景的。unity异步加载场景有个小坑,也就是加载进度只有90的时候,就进入场景了,进度条到不了100%,所以最后一句控制一下,让进度条读到100的时候再切换界面。
由于使用异步加载,在加载的时候界面上的元素还是可以更新的,在update中来做,用slider做进度条简直不要太简单,给sliderbar换一个外观,做一个sprite animation效果出来一点也不觉得勉强!良心推荐(如上图所示)。
void Update()
{
if (async == null)
{
return;
}
if (async.progress < 0.9f) { toProgress = (int)(async.progress * 100); } else { toProgress = 100; } if (displayProgress < toProgress) { displayProgress++; } if (displayProgress == 100)//async.isDone应该是在场景被激活时才为true { async.allowSceneActivation = true; } loadingText.text = displayProgress+"%"; progress_slider.value = displayProgress * 0.01f; }
上面图片是我自己做的音乐小游戏,美工能力很差,勿喷(⊙﹏⊙),将就看吧。对了上面还有一个核心问题没有说。B场景加载的asset内容怎么在C场景中使用呢?这个也简单。定义一个公共的静态变量就可以了。在C场景中使用B.asset就可以了。
public static string[] BundleName = { "gx", "zmczx", "girlfriend", "numb", "sheismysin",
"rollinginthedeep", "ghsy", "mhtc", "zdan", "wdzr" };
相关链接:unity使用网站webservice的简单办法。