unity5的AssetBundle批量打包的小技巧
2018-10-09 本文已影响0人
jojo911
游戏因为要做微端的功能,包要尽可能的小,所以资源需要拆的很细,以场景为例,场景上存在大量物件,所有物件都是Prefab,加载场景时只有一个基础场景,所有物件都是动态加载。
unity5编辑器上的UI可以设置assetBundleName,不过个人觉得很麻烦。
替代方案是可以把所有的资源都放到一个list,然后调用BuildPipeline.BuildAssetBundles,如果一个贴图有在list里,
那么所有用到该贴图的Prefab就不会包含该贴图,
从而不会造成AssetBundle资源变大。达到最小包的目的。
代码如下:
public static void BuildAllPrefab()
{
List textureList = new List();
List materialList = new List();
List shaderList = new List();
List prefabPathList = new List(); //所有Prefab的路径列表,这里就不写相关代码了
for (int i = 0; i < prefabPathList.Count; ++i)
{
string path = prefabPathList[i];
string fileName = Path.GetFileNameWithoutExtension(path);
if (string.IsNullOrEmpty(fileName)) continue;
string[] tmpdependencies = AssetDatabase.GetDependencies(new string[] { path });
foreach (string tmpdependencie in tmpdependencies)
{
string tmp = tmpdependencie.ToLower();
string mame = Path.GetFileNameWithoutExtension(tmp).ToLower();
if (tmp.Contains(".tga") || tmp.Contains(".png") || tmp.Contains(".jpg"))
{
if (!textureList.Contains(tmp))
{
textureList.Add(tmp);
}
}
else if (tmp.Contains(".shader"))
{
if (!shaderList.Contains(tmp))
{
shaderList.Add(tmp);
}
}
else if (tmp.Contains(".mat"))
{
if (!materialList.Contains(tmp))
{
materialList.Add(tmp);
}
}
}
}
List buildInfoList = new List();
string Extension = "";
BuildTarget target = BuildTarget.StandaloneWindows;
foreach (string path in textureList)
{
buildInfoList.Add(GetDependencieAssetBundleInfo(path, ".x" + Extension));
}
foreach (string path in shaderList)
{
buildInfoList.Add(GetDependencieAssetBundleInfo(path, ".x" + Extension));
}
foreach (string path in materialList)
{
buildInfoList.Add(GetDependencieAssetBundleInfo(path, ".x" + Extension));
}
foreach (string path in prefabPathList)
{
buildInfoList.Add(GetDependencieAssetBundleInfo(path, ".x" + Extension));
}
if (buildInfoList.Count > 0)
{
ToolCommon.CreatePath("assetbundles/assets/scenes/");
if (BuildPipeline.BuildAssetBundles("assetbundles/assets/scenes/", buildInfoList.ToArray(), BuildAssetBundleOptions.None, target))
{
// byte[] bytes = AssetsEncrypts.ReadFileToByte(dest);
// AssetsEncrypts.EncryptBytes(bytes);
// AssetsEncrypts.WriteByteToFile(bytes, dest);
}
else
{
Debug.LogError("Build Scene Dynamic Error!");
}
}
}
public static AssetBundleBuild GetDependencieAssetBundleInfo(string path, string Extension)
{
string dependenciePath = "";
string fileName = Path.GetFileNameWithoutExtension(path);
if (path.Contains(".tga") || path.Contains(".png") || path.Contains(".jpg"))
{
dependenciePath = "texture/" + fileName + Extension;
}
else if (path.Contains(".shader"))
{
dependenciePath = "shader/" + fileName + Extension;
}
else if (path.Contains(".mat"))
{
dependenciePath = "fbx/materials/" + fileName + Extension;
}
else if (path.Contains(".fbx"))
{
dependenciePath = "fbx/" + fileName + Extension;
}
else if (path.Contains(".prefab"))
{
dependenciePath = "prefab/" + fileName + Extension;
}
else
{
dependenciePath = ToolCommon.GetWindowPath(path, Extension);
dependenciePath = dependenciePath.Replace("assetbundles/assets/scene/", "");
}
AssetBundleBuild buildInfo = new AssetBundleBuild();
buildInfo.assetBundleName = dependenciePath;
buildInfo.assetNames = new string[] { path };
return buildInfo;
}