Unity学习日记:使用AssetBunndle对场景进行打包及下载与加载

发表于2018-02-12
评论0 4.6k浏览

AssetBundle实现了资源与服务分离,热更新离不开AssetBunndle,下面给大家介绍下使用使用AssetBunndle对场景进行打包及下载与加载,具体步骤如下。

首先建立三个场景,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)代替。

建立下载及加载脚本如下:

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”共存。


如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论