Unity脚本类】Unity在编辑模式中时怎么从AB包中加载场景?

2021-01-27 13:41发布

7条回答
aijingda
2楼 · 2021-01-27 15:27

场景构建AB包的方法和资源类似:从AB中加载场景是不用把场景放到scene in Build中的,加载后读取即可。

using UnityEngine;
using System.IO;
using UnityEngine.Events;
using UnityEditor;
using System.Collections.Generic;
public class BuildAB  
{
 [MenuItem("Tools/BuildAssetbundle")]
 static void BuildAssetbundle()
 {
  string outPath = Path.Combine (Application.dataPath, "StreamingAssets");
  //如果目录已经存在删除它
  if (Directory.Exists (outPath)) {
   Directory.Delete (outPath,true);
  }
  Directory.CreateDirectory (outPath);
  List builds = new List ();
  //设置bundle名,和多少资源打在同一个Bundle内
  builds.Add (new AssetBundleBuild (){assetBundleName="scene-ab.unity3d",assetNames =new string[]{"Assets/scene-ab.unity"}});
  //构建Assetbundle
  BuildPipeline.BuildAssetBundles (outPath,builds.ToArray(),BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows64);
  //刷新
  AssetDatabase.Refresh ();
 }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.SceneManagement;
public class LoadABScene : MonoBehaviour {
 void Start () {
  string path = Path.Combine (Application.streamingAssetsPath, "scene-ab.unity3d");
  //加载场景Bundle
  AssetBundle.LoadFromFile (path);
  SceneManager.LoadScene ("scene-ab");
 }
}


征戰撩四汸
3楼 · 2021-11-22 18:48

1、通过打包工具将场景打包

2、使用UnityWebRequestAPI简单实现

public class sceneABLoad : MonoBehaviour

{

    //下载地址

    private string loadPath = "";

   

    void Start()

    {

        StartCoroutine(LoadAB());

    }


   

    void Update()

    {

        

    }


    IEnumerator LoadAB()

    {

        UnityWebRequest assetBundle = UnityWebRequestAssetBundle.GetAssetBundle(loadPath);

        yield return assetBundle.SendWebRequest() ;

        AssetBundle ab = DownloadHandlerAssetBundle.GetContent(assetBundle);

        //包中的场景名字

        SceneManager.LoadScene("AB1");

    }

}



小凡仔
4楼 · 2021-01-27 14:25

首先创建场景scene_0,在上面创建一个按钮,保存scene_0

然后创建场景scene_1,保存scene_1

然后分别运行其场景,在运行的过程中,点击“File”->“Build Setting”

如图所示,点击“Add Current”,场景就会自动加进去了

给scene_0中的button加一个点击事件,代码如图
Application.LoadLevel ("scene_1");和Application.LoadLevel (1);这两种方法都可以.。一个是加载名“scene_1”的关卡,一个是加载索引为1的关卡

运行游戏,点击按钮,就会进入下一个场景了

Kindery
5楼 · 2021-01-27 15:43

1.创建Assetbundle

         无论是模型资源还是UI资源,最好是先把他们放在Prefab中,然后在做成Assetbundle。我们以模型来举例,Assetbundle中可以放一个模型、也可以放多个模型,它是非常灵活了那么最需要考虑的就是模型空间占用的问题。

比如我们有两个完全一样的模型,但是他们身上绑定的脚本不一样,此时需要把这两个模型放在两个不同Prefab中。如下图所示,我们分别对这两个Prefab打包,我们可以清晰的看到两个相同的Prefab打包在一起只占1M空间,而将他们分别打包会占1 + 1 = 2M空间。 Prefab在打包的同时会把模型身上的所有材质、贴图、组件、脚本全部包含进去。

kitidog2016
6楼 · 2021-01-27 19:00

因为开发的一个插件需求,要在unity编辑模式下从ab包加载场景,而EditorSceneManager.OpenScene只能根据本地路径加载场景文件,有没有其他的方法,如果能够异步加载更好了

1,游戏启动,自定义版本管理器去安卓的持久化目录下查找我们自定久的版本管理文件 rep.db,若该文件不存在,说明这是游戏第一次启动,于是就把streammingAssets下的LUA文件夹和resoure文件夹及rep.db及版本号文件version.txt及资源列表文件resource_list.txt拷到持久化目录下。

若发现rep.db存在,则去WEB资源服务器上取资源版本号,并与version.txt中的版本号对比,如不一致,则去对比服务器与本地的resource_list.txt(每个文件对应一个MD5),少的删除,多的增加,将资源从WEB服务器上拉到持久化目录,并重新写一个rep.db,记录了LUA文件,资源文件的相对-绝对路径映射,相对路径就是资源打包时指定的资源名称,比如打一个资源包 assets/res/pictures,下面有一组图片,分别命名为 assets/res/pictures/grass.png,assets/res/pictures/stone.png等,并将资源名与资源包的对应关系写到一个配置文件 asset_2_bundle.txt中,以便加载时使用。

资源打包时,对AB包内的资源名称并没有什么限制条件,既可以使用带路径的名称,也可使用一个简单名称,但在游戏中,因为资源很多,为防止资源重名,我们要使用带路径资源名。

2,资源更新完毕,游戏运行,当需要加载" assets/res/pictures/grass.png"这张图片时,根据这个路径名去 asset_2_bundle.txt中去查找对应的AB包名,然后再根据AB包名去rep.db中查找AB包在安卓上的绝对路径名(持久化目录下),然后createBundleFromefile创建这个AB包,并缓存它。然后用AB.LOADASSET("assets/res/pictures/grass.png")加载资源,

因为assets/res/pictures/grass.png这个资源名是我们在打AB包时指定的,因此AB可以找到它


Mantra
8楼 · 2021-03-12 15:05

可以借助AssetBundle类中Load相关的方法,如下图所示,可以实现加载AB包。

QQ截图20210312150421.png

相关问题推荐

没有解决我的问题,去提问