前段时间说了AssetBundle打包,先设置AssetLabels,再执行打包,但是这样有个弊端就是所有设置了AssetLabels的资源都会打包,这次说说不设置AssetLabels,该如何打包AssetBundle

BuildPipeline.BuildAssetBundles() 这个函数,有多个重载,一个不用AssetBundleBuild数组,一个需要,如果设置了AssetLabels,那么这时候是不需要的,如果没有设置,那么我们就可以打包自定义项,

AssetBundleBuild assetBundleBuild = new AssetBundleBuild();  我们可以new 出来一个 AssetBundleBuild  ,在这里指定他的  assetBundleName  和  assetBundleVariant  ,也就是前面提到的AssetLabels,

同时还要指出此资源所在地址     assetBundleBuild.assetNames = new string[] { path };  并将所有的 AssetBundleBuild  做为数组返回,填入 BuildPipeline.BuildAssetBundles() 所需要的参数中;

详见代码

 static List<AssetBundleBuild> listassets = new List<AssetBundleBuild>();  //第二种打包方式用
    static List<DirectoryInfo> listfileinfo = new List<DirectoryInfo>();
    static bool isover = false; //是否检查完成,可以打包

    public static bool GetState()
    {
        return isover;
    }

    public static AssetBundleBuild[] GetAssetBundleBuilds()
    {
        return listassets.ToArray();
    }

    public static void   SetAssetBundleBuilds()
    {
        UnityEngine.Object obj = Selection.activeObject;    //选中的物体
        string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹  //目录结构  Assets/Resources 没有Application.datapath
        SearchFileAssetBundleBuild(path);
    }

    public static void SearchFileAssetBundleBuild(string path)   //是文件,继续向下
    {
        DirectoryInfo directory = new DirectoryInfo(@path);
        FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();
        listfileinfo.Clear();
        foreach (var item in fileSystemInfos)
        {
            int idx = item.ToString().LastIndexOf(@"\");
            string name = item.ToString().Substring(idx + 1);
            if ((item as DirectoryInfo) != null)
                listfileinfo.Add(item as DirectoryInfo);
            if (!name.Contains(".meta"))
            {
                CheckFileOrDirectoryReturnBundleName(item, path + "/" + name);
            }
        }
        if (listfileinfo.Count == 0)
            isover = true;
        else
        {
            Debug.LogError(listfileinfo.Count);
        }
    }

    public static string CheckFileOrDirectoryReturnBundleName(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
    {
        FileInfo fileInfo = fileSystemInfo as FileInfo;
        if (fileInfo != null)
        {
            string[] strs = path.Split(‘.‘);
            string[] dictors = strs[0].Split(‘/‘);
            string name = "";
            for (int i = 1; i < dictors.Length; i++)
            {
                if (i < dictors.Length - 1)
                {
                    name += dictors[i] + "/";
                }
                else
                {
                    name += dictors[i];
                }
            }
            AssetBundleBuild assetBundleBuild = new AssetBundleBuild();
            assetBundleBuild.assetBundleName = name;
            assetBundleBuild.assetBundleVariant = "bytes";
            assetBundleBuild.assetNames = new string[] { path };
            listassets.Add(assetBundleBuild);
            return name;
        }
        else
        {
            SearchFileAssetBundleBuild(path);
            return null;
        }
    }

然后在这里调用

注意,因为文件夹下还可能有文件夹,我们要等所有资源遍历完成,再打包,所以用了一个死循环

 [MenuItem("Tools/打包选中文件夹下所有项目")]
    public static void BundSelectionAssets()
    {
        BuilderAssetsBunlds.SetAssetBundleBuilds();
        while (true)
        {
            if (BuilderAssetsBunlds.GetState())
                break;
            else
                Debug.LogError("等待.....");
        }
        BuildPipeline.BuildAssetBundles(BuilderAssetsBunlds.GetOutAssetsDirecotion(), BuilderAssetsBunlds.GetAssetBundleBuilds(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);

    }

好了,今天就到这里,加上前面的,所有的都在这里

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Text;
using System;
using System.Security.Cryptography;

public class BuilderAssetsBunlds
{
    public static string GetOutAssetsDirecotion() //打包输出地址,后续会再完善
    {
        string assetBundleDirectory = Application.streamingAssetsPath;
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        return assetBundleDirectory;
    }

    /// <summary>
    /// 检查目标文件下的文件系统
    /// </summary>
    public static void CheckFileSystemInfo()  //检查目标目录下的文件系统
    {
        AssetDatabase.RemoveUnusedAssetBundleNames(); //移除没有用的assetbundlename
        UnityEngine.Object obj = Selection.activeObject;    //选中的物体
        string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹  //目录结构  Assets/Resources 没有Application.datapath
        CoutineCheck(path);
    }

    public static void CheckFileOrDirectory(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
    {
        FileInfo fileInfo = fileSystemInfo as FileInfo;
        if (fileInfo != null)
        {
            SetBundleName(path);
        }
        else
        {
            CoutineCheck(path);
        }
    }

    public static void CoutineCheck(string path)   //是文件,继续向下
    {
        DirectoryInfo directory = new DirectoryInfo(@path);
        FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();

        foreach (var item in fileSystemInfos)
        {
            // Debug.Log(item);
            int idx = item.ToString().LastIndexOf(@"\");
            string name = item.ToString().Substring(idx + 1);

            if (!name.Contains(".meta"))
            {
                CheckFileOrDirectory(item, path + "/" + name);  //item  文件系统,加相对路径
            }
        }
    }

    public static void SetBundleName(string path)  //设置assetbundle名字
    {
        //  Debug.LogError(path);
        var importer = AssetImporter.GetAtPath(path);
        string[] strs = path.Split(‘.‘);
        string[] dictors = strs[0].Split(‘/‘);
        string name = "";
        for (int i = 1; i < dictors.Length; i++)
        {
            if (i < dictors.Length - 1)
            {
                name += dictors[i] + "/";
            }
            else
            {
                name += dictors[i];
            }
        }
        if (importer != null)
        {
            importer.assetBundleName = name;
            importer.assetBundleVariant = "bytes";
            // importer.assetBundleName = GetGUID(path);   //两种设置方式
        }
        else
            Debug.Log("importer是空的");
    }

    public static string GetGUID(string path)
    {
        return AssetDatabase.AssetPathToGUID(path);
    }

    //*****************配置文件设置***********************////////////

    static Dictionary<string, string> dicversoion = new Dictionary<string, string>(); //版本
    static Dictionary<string, string> dicurl = new Dictionary<string, string>();      //下载地址

    public static string GetAssetBundleStringPath()  //得到存放打包资源的文件路径
    {
        string path = Application.streamingAssetsPath;
        //Debug.Log(path);
        string[] strs = path.Split(‘/‘);
        int idx = 0;
        for (int i = 0; i < strs.Length; i++)
        {
            if (strs[i] == "Assets")
                idx = i;
        }
        // Debug.Log(idx);
        //path = strs[strs.Length - 2] + "/" + strs[strs.Length - 1];
        string str = "";
        for (int i = idx; i < strs.Length; i++)
        {
            if (i != strs.Length - 1)
                str += strs[i] + "/";
            else if (i == strs.Length - 1)
                str += strs[i];
            //Debug.Log(i);
        }
        path = str;
        return path;
        //Debug.Log(path);
    }

    public static void CheckAssetBundleDir(string path)   //是文件,继续向下
    {
        DirectoryInfo directory = new DirectoryInfo(@path);
        FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();

        foreach (var item in fileSystemInfos)
        {
            // Debug.Log(item);
            int idx = item.ToString().LastIndexOf(@"\");
            string name = item.ToString().Substring(idx + 1);

            if (!name.Contains(".meta"))
            {
                CheckAssetBundleFileOrDirectory(item, path + "/" + name);  //item  文件系统,加相对路径
            }
        }
    }

    public static void CheckAssetBundleFileOrDirectory(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
    {
        FileInfo fileInfo = fileSystemInfo as FileInfo;
        if (fileInfo != null)
        {
            Debug.Log("不为空,MD5值==>" + GetMD5(path));
            // string guid = AssetDatabase.AssetPathToGUID(path);
            // Debug.Log("不为空,文件名字是==>>"+guid);
            Addconfigdic(fileInfo.Name, GetMD5(path));
        }
        else
        {
            CheckAssetBundleDir(path);
        }
    }

    public static string GetMD5(string path)
    {
        FileStream fs = new FileStream(path, FileMode.Open);
        MD5 md5 = new MD5CryptoServiceProvider();
        byte[] retVal = md5.ComputeHash(fs);
        fs.Close();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < retVal.Length; i++)
        {
            sb.Append(retVal[i].ToString("x2"));
        }
        return sb.ToString();
    }

    public static void Addconfigdic(string name, string verMd5)
    {
        dicversoion.Add(name, verMd5);
    }

    public static void CreateConfigFile(string path) //创建配置文件
    {

    }
    // -------------------------------我是分割线------------------------------------
    //   割.............................
    static List<AssetBundleBuild> listassets = new List<AssetBundleBuild>();  //第二种打包方式用
    static List<DirectoryInfo> listfileinfo = new List<DirectoryInfo>();
    static bool isover = false; //是否检查完成,可以打包

    public static bool GetState()
    {
        return isover;
    }

    public static AssetBundleBuild[] GetAssetBundleBuilds()
    {
        return listassets.ToArray();
    }

    public static void   SetAssetBundleBuilds()
    {
        UnityEngine.Object obj = Selection.activeObject;    //选中的物体
        string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹  //目录结构  Assets/Resources 没有Application.datapath
        SearchFileAssetBundleBuild(path);
    }

    public static void SearchFileAssetBundleBuild(string path)   //是文件,继续向下
    {
        DirectoryInfo directory = new DirectoryInfo(@path);
        FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();
        listfileinfo.Clear();
        foreach (var item in fileSystemInfos)
        {
            int idx = item.ToString().LastIndexOf(@"\");
            string name = item.ToString().Substring(idx + 1);
            if ((item as DirectoryInfo) != null)
                listfileinfo.Add(item as DirectoryInfo);
            if (!name.Contains(".meta"))
            {
                CheckFileOrDirectoryReturnBundleName(item, path + "/" + name);
            }
        }
        if (listfileinfo.Count == 0)
            isover = true;
        else
        {
            Debug.LogError(listfileinfo.Count);
        }
    }

    public static string CheckFileOrDirectoryReturnBundleName(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
    {
        FileInfo fileInfo = fileSystemInfo as FileInfo;
        if (fileInfo != null)
        {
            string[] strs = path.Split(‘.‘);
            string[] dictors = strs[0].Split(‘/‘);
            string name = "";
            for (int i = 1; i < dictors.Length; i++)
            {
                if (i < dictors.Length - 1)
                {
                    name += dictors[i] + "/";
                }
                else
                {
                    name += dictors[i];
                }
            }
            AssetBundleBuild assetBundleBuild = new AssetBundleBuild();
            assetBundleBuild.assetBundleName = name;
            assetBundleBuild.assetBundleVariant = "bytes";
            assetBundleBuild.assetNames = new string[] { path };
            listassets.Add(assetBundleBuild);
            return name;
        }
        else
        {
            SearchFileAssetBundleBuild(path);
            return null;
        }
    }

}
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class Constant
{
    public static string SD_DIR = "SD_DIR";
}
public class BundleSystem
{
    //打包、、、、、、、、、、、、、、、、、、、、、、
    [MenuItem("Tools/打包所有设置AssetLable项目")]
    public static void BundlerAssets()
    {
        // Debug.LogError("打包Assets");
        BuildPipeline.BuildAssetBundles(BuilderAssetsBunlds.GetOutAssetsDirecotion(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }

    [MenuItem("Tools/打包选中文件夹下所有项目")]
    public static void BundSelectionAssets()
    {
        BuilderAssetsBunlds.SetAssetBundleBuilds();
        while (true)
        {
            if (BuilderAssetsBunlds.GetState())
                break;
            else
                Debug.LogError("等待.....");
        }
        BuildPipeline.BuildAssetBundles(BuilderAssetsBunlds.GetOutAssetsDirecotion(), BuilderAssetsBunlds.GetAssetBundleBuilds(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);

    }

    [MenuItem("Tools/设置Assetbundle名字")]
    public static void SetAssetBundellabls()
    {
        BuilderAssetsBunlds.CheckFileSystemInfo();
    }

    [MenuItem("Tools/设置配置文件")]
    public static void SetAssetConfig()
    {
        BuilderAssetsBunlds.CheckAssetBundleDir(BuilderAssetsBunlds.GetAssetBundleStringPath());
    }

    [MenuItem("Tools/测试")]
    static void PackAsset()
    {
        Debug.Log("Make AssetsBundle");
        //
        List<AssetBundleBuild> builds = new List<AssetBundleBuild>();
        AssetBundleBuild build = new AssetBundleBuild();

        build.assetBundleName = "first";
        build.assetBundleVariant = "u3";
        // build.assetNames[0] = "Assets/Resources/mascot.prefab";
        build.assetNames = new string[] { "Assets/PNG/结算副本.png" };
        builds.Add(build);
        // 第一个参数为打包文件的输出路径,第二个参数为打包资源的列表,第三个参数为打包需要的操作,第四个为打包的输出的环境
        //BuildPipeline.BuildAssetBundles(@"Assets/Bundle", builds.ToArray(),
        //    BuildAssetBundleOptions.None, BuildTarget.Android);
        BuildPipeline.BuildAssetBundles(@"Assets/Bundle", builds.ToArray(), BuildAssetBundleOptions.None, BuildTarget.Android);
        Debug.Log("11111" + builds.ToArray() + "222222");
    }
}

上篇传送门

http://www.cnblogs.com/lzy575566/p/7714510.html

时间: 2024-10-09 16:17:53

前段时间说了AssetBundle打包,先设置AssetLabels,再执行打包,但是这样有个弊端就是所有设置了AssetLabels的资源都会打包,这次说说不设置AssetLabels,该如何打包AssetBundle的相关文章

前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误。    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected est

前段时间,接手一个项目使用的是原始的jdbc作为数据库的访问,发布到服务器上在运行了一段时间之后总是会出现无法访问的情况,登录到服务器,查看tomcat日志发现总是报如下的错误. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too man

VS2010 打包生成exe文件后 执行安装文件出现 TODO:&amp;lt;文件说明&amp;gt;已停止工作并已关闭

一.VS2010 打包生成exe文件后  执行安装文件出现  TODO:<文件说明>已停止工作并已关闭 TODO: <文件说明>已停止工作 原因: 打包的时候在文件系统中建立了空目录,那么该空的目录就不会被载入进去,导致程序执行用到该目录的时候就会出现了该问题. 解决方法: 如建立了文件Calibration 那么先随便载入一个文件(如:3.csv)文件进去  不让它为空即可了 二.打包经常使用设置: 1.设置软件的安装文件夹 能够直接改动的faultLocation  如:E:\

前段时间一直不知道怎么学习,在网上找到一篇好文章分享给在路上的产品经理

如果你也是一枚刚入门的交互设计师,是不是常有这样一种感觉:不知从何下手,闷头读了一大堆书.学了一大堆软件.画了一大堆图之后还是感觉心里不踏实,总害怕自己还缺点什么,恨不得要有本<交互设计学习大纲>就好了.出现这个问题有两个原因,一是交互设计师没有可视性强的产物,交互设计师的产物一般是线框图.流程图.信息架构图.说明文档等等,但这些东西既不如视觉设计稿华丽精美,也不如程序代码高贵冷艳,在外行人看来初级交互设计师和高级交互设计师画的好像都差不多,轻易看不出你修炼到了几层功力;第二个原因是交互设计是

前段时间

前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看一下数据,数据库的数据量也不大,相关的一些索引都有,可就是慢.于是分析的sql 语句出来,分页功能,有select 查询和 count 两条语句. select 查询字段的时候,速度挺快,执行时间在1 s以内 ,但是执行count(1)  的时候,速度巨慢,执行时间增加到10 s.于是可以确定就是count语句导致的.定位到具体的语句之后,查看具体的执行计划.发现select 语句的查询计划和count(*)的查询计

shell脚本利用Here Document ,打包C的源码并编译生成再执行。shell携代攻击程序

shell脚本利用Here Document ,打包C的源码并编译生成再执行. shell携代攻击程序 cat 1.sh #!/bin/bash # echo "正在产生 hello.c ... " echo cat <<'EOF' > hello.c #include<stdio.h> int main() { printf("Hello world! \n"); return 0; } EOF echo "编译 hello

关于前段时间的Java实习面试总结

前言:关于前段时间(大概在五月下旬)的3+1面试,一直想做个总结,但是后面接踵而来的实验.考试.做课程设计,不得不把这事搁在现在来完成. 3+1面试总结 3+1,是学校与企业联合培养人才的一种方案,面向大三的学生.这一次,我们计算机专业和网络工程专业一共大概500多人,而实习岗位只有80个,还是有一点竞争的.毕竟学院要求不可以自己去外面找实习,只能在这里抢或者留在学校学习.说什么我都不想在大四呆在学校了. 清晰回忆起5月19日的下午,我带着准备好了的简历,提前30多分钟来到学院楼,企业也陆陆续续

在WINDOWS中设置计划任务执行PHP文件的方法

在网上找了些WINDOWS执行PHP的计划任务的方法,有一个写得很全,可惜在我这竟然没通过.最后不得不综合各门派的方法,才能在我这运行成功 1.写一个PHP程序,命名为test.php,内容如下所示: 复制代码 代码如下: <? $fp = fopen("test.txt", "a+"); fwrite($fp, date("Y-m-d H:i:s") . " 成功成功了!\n"); fclose($fp); ?>

IOS设置frame的时候经常要先取出来-&gt; 设置-&gt; 最后再赋值回去,非常麻烦,今天给大家推荐一种非常快捷的方法

大家可以去我的Githup下载   https://github.com/simplyou/YJ-UIIView-/tree/master 在设置尺寸的时候亲们有没有感觉很蛋疼啊,这里提供了一套分类,直接放进工程里,在PCH中包含头文件就能解决你蛋疼的问题; /***********************  .h文件   ******************************** //  UIView+YJ.h //  Created by 闪电 on 14-6-8. //  Copyr

设置当前exe执行文件为进程工作目录

设置当前exe执行文件为进程工作目录 两种办法: 1,   API void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); 这个函数将文件全名(带路径)分解成路径名,文件名,后缀名. 2, API BOOL PathRemoveFileSpec(           LPTSTR pszPath ); 使用例子: #include <windows.h> #include <