Unity3d C#脚本学习小结(九) [创建AssetBattle]

时间:2021-04-19 05:30:35

 都快一年没有写博客了,一直在忙着, 现在继续写我的Unity小经验,希望对像我这样刚学习Unity的开发爱好者有一定的帮助,各界人士发现错误的,给予指正。

以前一直没有做游戏内更新游戏,最近使用了Unity中的资源包,这个可以完成游戏的内部资源更新下载,不用让用户再次下载游戏,重新安装了,如果重新下载,这么大的流量,玩家会骂人的,好了,废话不多说,上菜。

我们知道游戏内更新是要下载游戏包的, 我们就用Unity打包出来,我在网上看到有的是打包成.unity3d格式的,也看过宣雨松的,他是打包成.assetbattle格式,其实我还是习惯用.unity3d格式。

第一步,创建一个脚本,命名为AssetPackageTool,在这个里面添加打包的脚本,贴上代码,大家看吧,

using UnityEngine;
using System.Collections;
using UnityEditor;

[AddComponentMenu("AssetPackageTool")]
public class AssetPackageTool : MonoBehaviour {


	/// <summary>
	///将选中的资源打进一个资源包 
	/// </summary>
	[MenuItem("AssetPackageTool/CreateAssetsInOnePackage")]
	static void CreateAssetsInOnePackage()
	{
		Caching.CleanCache();
		string path=Application.dataPath+"/StreamingAssets/version.unity3d";
		Object[] selectedAssets=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
		if(BuildPipeline.BuildAssetBundle(null,selectedAssets,path,BuildAssetBundleOptions.CollectDependencies))
			AssetDatabase.Refresh();
		else
			Debug.LogError("打包失败!");
	}
	/// <summary>
	/// 将选中的每一个资源打成一个资源包
	/// </summary>
	[MenuItem("AssetPackageTool/CreateAssetPerPackage")]
	static void CreateAssetPerPackage()
	{
		Object[] SelectedAsset=Selection.GetFiltered(typeof(Object),SelectionMode.DeepAssets);
		foreach (Object item in SelectedAsset) 
		{
			string sourcePath=AssetDatabase.GetAssetPath(item);
			string targetPath=Application.dataPath+"/StreamingAssets/"+item.name+".unity3d";
			if(BuildPipeline.BuildAssetBundle(item,null,targetPath,BuildAssetBundleOptions.CollectDependencies))
			{
				Debug.Log("success");
			}
			else
			{
				Debug.Log("Failure");
			}
		}
		AssetDatabase.Refresh();
		
	}
	/// <summary>
	/// 将场景打成一个包
	/// </summary>
	[MenuItem("AssetPackageTool/CreateScenePackageInOne")]
	static void CreateScenePackageInOne()
	{
		Caching.CleanCache();
		#if UNITY_EDITOR
		string path=Application.dataPath+"StreamingAssets/scenePackage.unity3d";
		string[] levels={"Assets/Daikon Forge/Examples/ActionBar/ActionBar.unity"};
		BuildPipeline.BuildStreamedSceneAssetBundle(levels,path,BuildTarget.WebPlayer,BuildOptions.BuildAdditionalStreamedScenes);
		AssetDatabase.Refresh();
		#endif
	}
	
}
这样的话,我们就可以在菜单中使用这个脚本了,你会发现Unity顶部菜单栏会有AssetPackageTool选项,在选择之前先在项目中创建一个文件夹(StreamingAssets),因为打包都会打到这个文件夹中;先选择你需要打包的资源,然后点击按钮,就会发现StreamingAssets中有你刚才打的包了。

第二步:部署一个ftp,或者是一个网站,总之开放一个连接,可以下载到你的文件,当然你也可以使用file://,

第三部:通过unity的www下载你的资源包的路径,然后实例化出来,

using UnityEngine;
using System.Collections;

public class UpdateGameVersion : MonoBehaviour {


	//public static readonly string URLHead="file://"+Application.dataPath+"/StreamingAssets/";//地址头部
	#if UNITY_VERSION
	public static readonly string URLHead="ftp://192.168.0.1/version1/Interface.unity3d";//地址头部
	#endif

	#if UNITY_ANDROID
		public static readonly string URLHead="http://";//地址头部
	#endif

	public string fileName;
	WWW data=null;
	void OnGUI()
	{
		if(GUI.Button(new Rect(100,100,200,50),"点击更新"))
		{
			StartCoroutine(loadBundleObject("Interface.unity3d"));
		}
		if(data!=null)
		{
			Debug.Log((data.progress * 100).ToString() +"%");
			GUI.Label(new Rect(0,0,200,100),"loading " + (data.progress * 100).ToString() +"%");
		}
	}

	/// <summary>
	///加载资源 
	/// </summary>
	/// <returns>The bundle object.</returns>
	/// <param name="filename">文件名称(包含扩展名)或者服务器地址</param>
	IEnumerator loadBundleObject(string filename)
	{
		data=WWW.LoadFromCacheOrDownload("ftp://192.168.0.1/version1/Interface.unity3d",1);
		yield return data;
//		Instantiate(data.assetBundle.Load("Cube"));
		Instantiate(data.assetBundle.mainAsset);
		data.assetBundle.Unload(false);
	}

}

WWW.LoadFromCacheOrDownload是可以通过版本号下载的,在下载之前会先检查是否已经下载过该版本,如果有了,就直接从缓存中读取,否则就网络下载;