zoukankan      html  css  js  c++  java
  • 【Unity】Unity中资源动态载入的两种方式之AssetsBundle

    首先要说的是,我们的project中有2个脚本。各自是:
    Build(编辑器类脚本。无需挂载到不论什么物体)。可是必需要把Build脚本放到Editor目录中
    Load脚本,挂载到摄像机上<pre name="code" class="csharp">using UnityEngine;
    using System.Collections;
    using UnityEditor;
    
    public class Build : MonoBehaviour
    {
    	// 编辑器类
    	[MenuItem("Build/BuildAsset")]
    	// 打包单个资源的方法
    	static void BuildAsset ()
    	{
    		// 将物体打包到/AssetsBundles路径下同一时候命名为Cube1.assetbundle
    		string targetPath = Application.dataPath + "/AssetsBundles/Cube1.assetbundle"; 
    		// BuildPipeline 打包用 Selection (Selection.activeObject 在编辑器中选中的对象)
    		// 第二个參数null,是打包多个资源的时候用的。多个资源就是数组。单个资源的时候这个參数不用写
    		// 第三个參数是路径。你想把这个资源放到什么位置就写什么,而且还要命名为.assetbundl格式
    		BuildPipeline.BuildAssetBundle (Selection.activeObject, null, targetPath);
    		// 刷新资源,直接能够在unity中看到刚才打包的东西
    		AssetDatabase.Refresh();
    	}
    
    	// --------------------------------------------------------------------------------
    
    
    	[MenuItem("Build/BuildMultiAsset")]
    	// 打包多个资源的时候使用这种方法
    	static void BuildMultiAsset()
    	{
    		// 将物体打包到/AssetsBundles路径下同一时候命名为Cubes.assetbundle
    		string target = Application.dataPath + "/AssetsBundles/Cubes.assetbundle";
    		// 由于打包多个游戏对象。所以是一个数组,typr(Object)表示,仅仅要选择的物体是Object类型就能够
    		// 而且选择的模式是深度资源搜索(详细学名究竟叫啥我也忘了。。

    )。 // 意思是仅仅要你选择的object对象以下假设还有关联的东西就都会一起打包(unity导出场景的时候应该能够感受到) Object[] cubes = Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets); // 打包開始,由于是一堆资源。所以主资源为null,剩下两个參数意思同上 BuildPipeline.BuildAssetBundle(null,cubes,target); // 刷新资源,直接能够在unity中看到刚才打包的东西 AssetDatabase.Refresh(); } // -------------------------------------------------------------------------------- [MenuItem("Build/BuildScene")] // 打包场景的方法 static void BuildScene() { // 场景名字,为什么是数组呢(由于參数里要求这个參数是数组类型。。

    。。

    ) string [] sceneName = new string[]{Application.dataPath + "/scene1.unity"}; // 将物体打包到/AssetsBundles路径下同一时候命名为Scene1.assetbundle string targetPath = Application.dataPath + "/AssetsBundles/Scene1.assetbundle"; // 注意打包的方法名已经变成流类型了,后面的最后一个參数表示你要在上面平台执行 // iphone平台就是用BuildTarget.iPhone这个參数 // 安卓平台就是用BuildTarget.Android这个參数 // 相似參数能够自己查看。。。 BuildPipeline.BuildStreamedSceneAssetBundle(sceneName,targetPath,BuildTarget.WebPlayer); // 刷新资源。直接能够在unity中看到刚才打包的东西 AssetDatabase.Refresh(); } // -------------------------------------------------------------------------------- [MenuItem("Build/BuildDependence")] static void BuildDependence() { // 对一些公共參数的定义 // // 定义路径目录是Application.dataPath读取后的路径 加上 "/AssetBundles" string path = Application.dataPath + "/AssetsBundles"; // 定义资源包的依赖关系选项 BuildAssetBundleOptions buildOp = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets; // --------------------------------------------------------------------- // Push和Pop是成对出现的。他们的作用是维持一个依赖关系 // 我们当前的资源包关系是这种: /* Tex1.assetbundle资源包(Tex1的包里有以下2个资源包) c1.assetbundle资源包(c1和c2是平级关系) c2.assetbundle资源包 */ //依赖资源压栈 BuildPipeline.PushAssetDependencies(); // 替代之前的selection的手动选择方式 Object tex = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Tex1.jpg"); // 全部兴许资源将共享这一资源包中的内容,可是你要保证的是,在使用c1和c2这种内层依赖包时 // 你已经载入了最外层资源包Tex1 BuildPipeline.BuildAssetBundle(tex, null,path + "/Tex1.assetbundle", buildOp); // 这里使用一对Push和Pop是将我们接下来载入的c1资源包和tex依赖起来 BuildPipeline.PushAssetDependencies(); Object c1 = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Cube1.prefab"); BuildPipeline.BuildAssetBundle(c1, null, path + "/c1.assetbundle", buildOp); BuildPipeline.PopAssetDependencies(); // 同上 BuildPipeline.PushAssetDependencies(); Object c2 = AssetDatabase.LoadMainAssetAtPath("Assets/Resources/Cube2.prefab"); BuildPipeline.BuildAssetBundle(c2, null,path + "/c2.assetbundle", buildOp); BuildPipeline.PopAssetDependencies(); // 依赖资源出栈 BuildPipeline.PopAssetDependencies(); AssetDatabase.Refresh(); } }


    using UnityEngine;
    using System.Collections;
    
    public class Load : MonoBehaviour {
    	// 全部公共的路径名开头都是这个目录,所以单列出来,简化后面代码
    	public static string loadPath  = "file://" + Application.dataPath +"/AssetsBundles";
    
    	// 画一个button
    	void OnGUI()
    	{
    		if(GUILayout.Button("LoadTex"))
    		{
    			StartCoroutine(LoadTex(loadPath));
    		}
    		if (GUILayout.Button("LoadCube")) {
    			// 由于以下的方法都是协同程序,所以须要手动开启协同程序
    			StartCoroutine(LoadCube(loadPath));
    		}
    		if (GUILayout.Button("LoadVersion")) {
    			StartCoroutine(LoadVersion(loadPath));
    		}
    		if (GUILayout.Button("LoadCubes")) {
    			StartCoroutine(LoadCubes(loadPath));
    		}
    		if (GUILayout.Button("LoadScene")) {
    			StartCoroutine(LoadScene(loadPath));
    		}
    	}
    
    	// 协同方法,载入1个cube的方法
    	IEnumerator LoadCube (string path)
    	{
    		// 下载一个已经打包好的assetbundle(打包须要在Build脚本中实现,在project里手动打包)
    		WWW www = new WWW(path + "/Cube1.assetbundle");
    		// 返回下载的assetbundle包
    		yield return www;
    		// 实例化一个cube,游戏物体使用assetbundle中的主资源(由于是单独打包,所以仅仅有一个主资源),后面是实例化物体的位置和角度信息
    		Instantiate(www.assetBundle.mainAsset,new Vector3(Random.Range(0,9),Random.Range(0,9),Random.Range(0,9)),Quaternion.identity);
    		// 实例化成功后输出资源名字
    		print(www.assetBundle.mainAsset);
    		// 卸载刚才已经下载的资源在内存中(就是在内存中删除)
    		www.assetBundle.Unload(false);
    	}
    
    
    	// 协同方法,载入多个cube的方法
    	IEnumerator LoadCubes(string path)
    	{
    		// 下载一个已经打包好的包括多个游戏对象的资源包
    		WWW www = new WWW(path + "/Cubes.assetbundle");
    		yield return www;
    		// 下载资源包中的当中一个名字叫Cube1的物体(这个名字一定是在刚才下载的那个包里有的)
    		Instantiate(www.assetBundle.Load("Cube1"),Vector3.up,Quaternion.identity);
    		// 下载资源包中的当中一个名字叫Cube2的物体(这个名字一定是在刚才下载的那个包里有的)
    		Instantiate(www.assetBundle.Load("Cube2"),Vector3.up,Quaternion.identity);
    	}
    
    	// 协同方法,载入一个场景的方法
    	IEnumerator LoadScene(string path)
    	{
    		// 下载已经打包好的场景
    		WWW www = new WWW(path + "/scene1.assetbundle");
    		yield return www;
    		// 获取到包括场景的assetbundle资源包
    		AssetBundle bundle = www.assetBundle;
    		// 载入的是资源包中的scene1场景,假设没有上面的这行代码。就无法载入这个场景
    		Application.LoadLevel("scene1");
    	}
    
    
    
    
    	IEnumerator LoadVersion(string path)
    	{	
    		// 依据版本载入assetbundle
    		WWW www = WWW.LoadFromCacheOrDownload(path + "/Cube1.assetbundle",1);
    		yield return www;
    		if (www.error != null) {
    			print(www.error);
    		} else {
    			Instantiate(www.assetBundle.mainAsset);
    		}
    	}
    
    
    	IEnumerator LoadTex(string path)
    	{
    		WWW www = new WWW(path + "/Tex1.assetbundle");
    		WWW wwwc1 = new WWW(path + "/c1.assetbundle");
    		yield return www;
    		print(www.assetBundle.mainAsset);
    		Instantiate(wwwc1.assetBundle.mainAsset);
    
    	}
    }
    

    
    
    
       
    
  • 相关阅读:
    Fluent API
    什么是blazor
    10.事务
    9.用ExecuteSqlCommand执行存储过程
    8.自增主键 插入指定主键的数据
    7.图
    6.实体与上下文的关系
    5.并发
    4.跟踪
    3.级联删除
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6756208.html
Copyright © 2011-2022 走看看