AssetBundle简单的打包、加载随笔
今天简单了解了一下AssetBundle的打包加载,简单写一下,加深印象共同学习。有不妥的地方希望大家指正。叙述一下简单的思路。
第一先清除一下工程中的AssetBundleName,避免出现多打包或者重名的情况出现。ps:ClearAssetName()函数
第二通过使用尾递归为需要打包的资源通过以各个文件夹名字进行命名,一则通过文件夹命名打包可以将资源合理规划,防止出现只有一个包或者每个资源都打一个包出现资源浪费。
将需要打包的资源放在Resources文件里,里边可以将不同的资源分别归类方便打包。具体的分类思路放在最后。
第三进行打包。
第四加载。
ps:该脚本放在Editor下,不用继承MonoBehaviour
private static string outPath = Application.dataPath + “/Package”; //打包输出路径
[MenuItem(“/TOOls/BuildAssetBundles”)] //这个API 可以让TOOls/BuildAssetBundles在unity菜单栏中实现
public static void BuildFunc()
{
//Directory.Delete(outPath, true);
ClearAssetName(); //清除assetBundleName
SetName(resName); //通过文件夹命名
if (!Directory.Exists(outPath)) //判定输出是否存在 如果不存在就创建
{
Directory.CreateDirectory(outPath);
}
BuildPipeline.BuildAssetBundles(outPath,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64); / /打包
AssetDatabase.Refresh(); //刷新
}
{
string[] name = AssetDatabase.GetAllAssetBundleNames(); //获得所有的AssetBundleName 返回一个string数组
for (int i = 0; i < name.Length; i++)
{
AssetDatabase.RemoveAssetBundleName(name[i],true); //循环删除
}
}
{
DirectoryInfo dir = new DirectoryInfo(path); //获取资源文件夹路径 到resources文件夹
FileSystemInfo[] file = dir.GetFileSystemInfos(); //获取该文件夹中的所有文件
for (int i = 0; i < file.Length; i++)
{
if (file[i] is DirectoryInfo) //如果查找是文件夹,尾递归继续查找资源
{
SetName(file[i].FullName);
}
else
{
//通过文件名命名 并且判断是不是meat文件
if (!file[i].Name.EndsWith(“.meta”))
{
//开始命名
Func(file[i].FullName);
}
}
}
{
//文件路径 ==》E:\个人\个人工程\Unity2017\AssetBundleProject\BundleProject\Assets\Resources\Mat\black.mat
string sources = fileName;
Debug.Log(“文件路径==》”+sources);
string assetpath =”Assets” +sources.Substring(Application.dataPath.Length); //截取到/Resources文件这
string assetpath2 = sources.Substring(Application.dataPath.Length+1);
string name = assetpath2.Substring(assetpath2.IndexOf(‘\\’)+1, assetpath2.LastIndexOf(‘\\’) – assetpath2.IndexOf(‘\\’)-1);
AssetImporter assetim = AssetImporter.GetAtPath(assetpath); //通过资源路径获取该资源
assetim.assetBundleName= name; //设置AssetBundleName
}
{
GameObject go= load(); //调用加载方法
go.transform.position=Vector3.one;
}
{
AssetBundle asset = AssetBundle.LoadFromFile(Application.dataPath + “/Package/Package”); //获取总包
AssetBundleManifest assetmanifest = asset.LoadAsset<AssetBundleManifest>(“AssetBundleManifest”); //加载总的依赖关系
string[] depen = assetmanifest.GetAllDependencies(“newfolder”); //将需要加载资源的依赖关系都加载出来 存在数组中
foreach (var item in depen)
{
AssetBundle.LoadFromFile(Application.dataPath + “/Package/” +item); //遍历加载
}
GameObject cube = ab.LoadAsset<GameObject>(“Cube”); //加载资源
GameObject go= Instantiate(cube); //实例化
return go;