首先建立三个场景,now、1、2,其中now为空场景,1和2场景分别设置一些不同的模型用以区分。如图:
在Editor文件夹下建立脚本BuildSceneAssetBundle。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;//必须引用UnityEditor
public class BuildSceneAssetBundle : MonoBehaviour
{
[MenuItem("资源包/创建场景资源包")]
static void buildMethod()
{
Caching.CleanCache();//清楚缓存
//将要打包的场景在Assets文件夹下的路径和其名称添加到字符串数组里,此处要加场景的扩展名(.unity)。
string[] SceneNames = { "Assets/Scene/1.unity", "Assets/Scene/2.unity" };
//打包场景使用BuildPipeline.BuildPlayer进行,第一个参数是存放要打包场景路径的字符串数组,第二个参数是打包以后存放资源包的路径及资源包名称,可不带扩展名,若带了扩展名,下载此包时也要带上扩展名才能正确下载到此包,第三个参数是目标平台,第四个参数是其它选项,在打包场景时此处必须选择BuildAdditionalStreamedScenes
BuildPipeline.BuildPlayer(SceneNames, Application.dataPath+"/abFolder_Scene/SceneAbs.unity3d", BuildTarget.StandaloneWindows, BuildOptions.BuildAdditionalStreamedScenes);
AssetDatabase.Refresh();//刷新Unity的界面,以确保资源包显示出来
}
}
找到菜单栏中的“创建场景资源包”选项,单击创建场景资源包。可以看到在输出路径上生成一个文件,即场景资源包。
场景资源包的下载及加载:
场景资源包的下载与普通的AssetBundle下载一样,都是使用WWW来完成的。但是场景资源包的加载则不同。
Application.LoadLevel(); 该接口可以通过名字或索引载入AssetBundle文件中包含的对应场景。当加载新场景时,所有之前加载的GameObject都被销毁。该接口已弃用,被SceneManager.LoadScene()代替了。
Application.LoadLevelAsync(); 该接口和Application.LoadLevel()作用相同,不同的是该接口是对场景进行异步加载,即加载时主线程可以继续执行。已弃用,被SceneManager.LoadSceneAsync()代替。
Application.LoadLevelAdditive(); 该接口不同于Application.LoadLevel()的是,加载场景不会销毁之前加载的GameObject。该接口已弃用,被SceneManager.LoadScene()(重载的函数,第二个参数决定了是否销毁之前加载的GameObject)代替了。
Application.LoadLevelAdditiveAsync(); 和Application.LoadLevelAdditive()不同的是,该接口是异步加载,即加载时主线程可以继续执行。已弃用,被SceneManager.LoadSceneAsync()(重载的函数,第二个参数决定了是否销毁之前加载的GameObject)代替。
(以上场景资源包加载所用接口相关内容来自:http://blog.csdn.net/u011976408/article/details/53433139)
建立下载及加载脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;//加载场景资源时必须引用UnityEngine.SceneManagement才能正确加载
public class DownloadSceneAssetBundles : MonoBehaviour
{
IEnumerator Start () {
Caching.CleanCache();//清除缓存
//下载场景资源包,因创建此资源包时加了扩展名(.unity3d),故此处下载时同样必须有扩展名
WWW w0 = WWW.LoadFromCacheOrDownload("file://" + Application.dataPath + "/abFolder_Scene/SceneAbs.unity3d", 0);
yield return w0;//等待下载完成
AssetBundle ab = w0.assetBundle;//加载场景资源包
SceneManager.LoadScene("1");//加载场景“1”,销毁已加载场景及GameObject
SceneManager.LoadScene("2", LoadSceneMode.Additive);//加载场景“2”,不销毁已加载场景及GameObject
}
}
将脚本挂载到当前场景(now)的MainCamera上,运行,会看到因为场景“1”的加载,“now”被销毁,而“2”场景在加载时选择不销毁已加载的场景,故最终场景“1”与“2”共存。