• Unity生成AB包

    2018-09-06 15:42:04
    https://docs.unity3d.com/2017.4/Documentation/Manual/AssetBundles-Workflow.html  以下写个例子,生成AB包。 例子:生成这两个物体的AB包 第一部分 界面可操作部分 把东西拖下来,生成预制体: 然后在...

    其实讲的最清楚的应该是官方教程:

    https://docs.unity3d.com/2017.4/Documentation/Manual/AssetBundles-Workflow.html

     以下写个例子,生成AB包。

    例子:生成这两个物体的AB包

    第一部分 界面可操作部分

    1. 把东西拖下来,生成预制体:
    2. 然后在属性的就会显示,上图右边的东西
    3. 自己命名,这里我命名为Object
      这边我把这两个预制体弄到同一个ab包中,所以命名的时候都叫一个名字

     第二部分 代码部分

    1. 我们先新建一个文件夹(Editor),在assets文件夹下,请注意,文件夹的名字一定要叫:Editor
    2. 然后新建一个脚本,一下代码为脚本内容。
    using System.IO;
    using UnityEditor;
    using UnityEngine;
    
    public class BuildAB : MonoBehaviour {
    
        //[MenuItem("AssetBundle/Package (Default)")]
        [MenuItem("Assets/Build AssetBundles")]
        static void BuildAllAssetBundles()
        {
            string assetBundleDirectory = "Assets/AssetBundles";
            if (!Directory.Exists(assetBundleDirectory))
            {
                Directory.CreateDirectory(assetBundleDirectory);
            }
            BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
        }
    }
    

    第三部分 生成

    以上代码copy之后,保存。此时unity会刷新一下,你会发现,

    点击上图框出来的那部分,就发现你的ab包生成好了,那生成到哪里了呢?

    在这:Assets\AssetBundles

    展开全文
  • Unity3Dab包

    2019-04-04 18:20:33
    1.删除OpenWindow下IOS文件下的内容 2. 3. 4.OpenWindow打开ABPath IOS文件夹压缩

    1.删除OpenWindow下IOS文件下的内容

    2.

    3.

    4.OpenWindow打开ABPath

    IOS文件夹压缩

    展开全文
  • 本资源介绍了Unity3D assetBundle的打包和几种不同的加载方式!
  • unity的加载资源的方法有很多,但是支持热更的只有一个ab加载。 趁着闲来无事,就去深入一下ab的打包。 AB打包简单的步骤就是把一个prefab的AssetBundle起一个名字(可以起中文,但是没必要)。 设置好之后试着Build...

    unity的加载资源的方法有很多,但是支持热更的只有一个ab加载。
    趁着闲来无事,就去深入一下ab的打包。

    AB打包简单的步骤就是把一个prefab的AssetBundle起一个名字(可以起中文,但是没必要)。prefab详细界面(inspector)
    设置好之后试着Build一下(指定输出的路径必须存在,代码必须放在Editor文件夹)

       [MenuItem("Build/Windos")]
        static void f_BuilAB() {
           BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
        }
    

    进度条结束之后去指定的文件夹查看得到如下文件,其中mainfest文件是数据清单。StreamingAssets命名与out路径挂钩。在这里插入图片描述
    其中streamingAssets.manifest记录当前文件夹ab资源的信息。

    现在已经得到了打包后的ab文件,接下来就是需要加载。
    我用的WWW加载,也有其他方式的加载。这个就要看个人习惯,习惯用那种方式就用那种方式。

    public class GloMain : MonoBehaviour
    {
        private WWW Loadab;
    
        private void Awake()
        {
            StartCoroutine("loadWWW");
        }
    
        IEnumerator loadWWW() {
    
            Loadab = new WWW(GloData.ABAdress+ "/test1");  //GloData.ABAdress=Application.streamingAssetsPath; 路径可以根据自己需求来修改
            yield return Loadab;
            if (Loadab.error != null)
            {
                Debug.Log(Loadab.error);
            }
            else
            {
                //string[] AllName = Loadab.assetBundle.GetAllAssetNames();
                //for (int i = 0; i < AllName.Length; i++)
                //{
                   // Debug.Log(AllName[i]);    --assets/deleceprelab/cube.prefab
                //}    
    
                GameObject oo = Loadab.assetBundle.LoadAsset<GameObject>("cube");
    	        //AB Load出来的资源必须实例化一份,这样才可以去使用它
                GameObject cube =Instantiate<GameObject>(oo);
    
                cube.transform.parent = transform;
                cube.transform.localPosition = Vector3.zero;
                //Debug.Log(Loadab.assetBundle.);
            }
        }
    }
    

    运行后效果如图在这里插入图片描述

    展开全文
  • unityAb 封装了资源打包,和加载方式,资源可放本地也可放服务器。提供了加载进度接口,更人性化使用
  • Unity AB包编辑器工具

    2020-07-07 12:59:04
    Unity的一个轻量级AB包编辑器工具,博客链接 https://blog.csdn.net/qq992817263/article/details/79654398
  • unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。  一个Assetbundle可以打包一个模型(这里的模型不单单指的是预制模型,...

    一、创建Assetbundle

    在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。

           一个Assetbundle可以打包一个模型(这里的模型不单单指的是预制模型,可以是Project视图下的任何东西),也可以是多个模型,但两种打包方式占用的空间不一样。

          比如我打包三个一样的模型(只不过他们的脚本不一样创建三个空的GameObject(One,Two,Three),分别挂载脚本One,Two,Three)。如果我为每个模型单独打包生成One,Two,Three三个Assetbundle,其所占的空间是A,B,C,但是A+B+C != D.由此可知想通的资源尽可能的打包到一起,他们共用一套资源。不相同的模型尽量分开打包。



    二、分开打包(注意这个脚本必须放在Editor文件夹内,Editor文件夹没有的话需自己创建)

    	/// <summary>
    	/// 将选中的预制分别打包
    	/// </summary>
    	[MenuItem("AssetBundleDemo/Create AssetBundles By themselves")]
    	static void CreateAssetBundleThemelves(){
    		//获取要打包的对象(在Project视图中)
    		Object[] selects = Selection.GetFiltered (typeof(Object),SelectionMode.DeepAssets);
    		//遍历选中的对象
    		foreach(Object obj in selects){
    			//这里建立一个本地测试
    			//注意本地测试中可以是任意的文件,但是到了移动平台只能读取路径StreamingAssets里面的
    			//StreamingAssets是只读路径,不能写入
    			string targetPath = Application.dataPath + "/AssetBundleLearn/StreamingAssets/" + obj.name + ".assetbundle";//文件的后缀名是assetbundle和unity都可以
    			if(BuildPipeline.BuildAssetBundle(obj,null,targetPath,BuildAssetBundleOptions.CollectDependencies)){
    
    				Debug.Log(obj.name + "is packed successfully!");
    			}else{
    				Debug.Log(obj.name + "is packed failly!");
    			}
    		}
    		//刷新编辑器(不写的话要手动刷新,否则打包的资源不能及时在Project视图内显示)
    		AssetDatabase.Refresh ();
    	}

    SelectionMode.DeepAssets

    这个选择模式意味着如果选择中包含多个文件,那么他将包含这个文件视图中的所有资源。

    他还有其他的各种选项(以下是官方文档)

    SelectionMode

    Description

    SelectionMode can be used to tweak the selection returned by Selection.GetTransforms.

    The default transform selection mode is: SelectionMode.TopLevel | SelectionMode.ExcludePrefab | SelectionMode.Editable.

    Unfiltered Return the whole selection.
    TopLevel Only return the topmost selected transform. A selected child of another selected transform will be filtered out.
    Deep Return the selection and all child transforms of the selection.
    ExcludePrefab Excludes any prefabs from the selection.
    Editable Excludes any objects which shall not be modified.
    Assets Only return objects that are assets in the Asset directory.
    DeepAssets If the selection contains folders, also include all assets and subfolders within that folder in the file hierarchy.

    最核心的方法:BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)

    参数1:它只能放一个对象,因为我们这里是分别打包,所以通过循环将每个对象分别放在了这里。

    参数2:可以放入一个数组对象。

    参数3:要打包到的路径

    参数4:默认情况下打的包只能在电脑上用,如果要在手机上用就要添加一个参数。

    Android上:

    BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies,BuildTarget.Android)

    IOS上:

    BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies,BuildTarget.iPhone)

    另外,电脑上和手机上打出来的Assetbundle不能混用,不同平台只能用自己的。

    三、一起打包

    	/// <summary>
    	/// 将选中的预制打包到一起
    	/// </summary>
    	[MenuItem("AssetBundleDemo/Create AssetBundles Together")]
    	static void CreateAssetBundleTogether(){
    		//要打包的对象
    		Object[] selects = Selection.GetFiltered (typeof(Object),SelectionMode.DeepAssets);
    		//要打包到的路径
    		string targetPath = Application.dataPath + "/AssetBundleLearn/StreamingAssets/Together.assetbundle";
    		if(BuildPipeline.BuildAssetBundle(null,selects,targetPath,BuildAssetBundleOptions.CollectDependencies)){
    			Debug.Log("Packed successfully!");
    
    		}else{
    			Debug.Log("Packed failly!");
    		}
    		//刷新编辑器(不写的话要手动刷新)
    		AssetDatabase.Refresh ();
    	}
    }


    四、读取

    using UnityEngine;
    using System.Collections;
    
    public class ReanAssetbundle : MonoBehaviour {
    
    	//不同平台下StreamingAssets的路径是不同的,这里需要注意一下。
    	public static readonly string m_PathURL =
    		#if UNITY_ANDROID
    		"jar:file://" + Application.dataPath + "!/assets/";
    		#elif UNITY_IPHONE
    		Application.dataPath + "/Raw/";
    		#elif UNITY_STANDALONE_WIN || UNITY_EDITOR
    	    "file://" + Application.dataPath + "/AssetBundleLearn/StreamingAssets/";
    		#else
    		string.Empty;
    		#endif
    
    	void OnGUI(){
    		if(GUILayout.Button("加载分开打包的Assetbundle")){
    			StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL + "One.assetbundle"));
    			StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL +  "Two.assetbundle"));
    			StartCoroutine(LoadGameObjectPackedByThemselves(m_PathURL + "Three.assetbundle"));
    
    		}
    		
    		if(GUILayout.Button("加载打包在一起的Assetbundle")){
    			StartCoroutine(LoadGameObjectPackedTogether(m_PathURL + "Together.assetbundle"));
    		}
    		
    	}
    	//单独读取资源
    	private IEnumerator LoadGameObjectPackedByThemselves(string path){
    		WWW bundle = new WWW (path);
    		yield return bundle;
    
    		//加载
    		yield return Instantiate (bundle.assetBundle.mainAsset);
    		bundle.assetBundle.Unload (false);
    	}
    
    	IEnumerator  LoadGameObjectPackedTogether (string path)
    	{
    		WWW bundle = new WWW (path);
    		yield return bundle;
    
    		Object one = bundle.assetBundle.Load ("One");
    		Object two = bundle.assetBundle.Load ("Two");
    		Object three = bundle.assetBundle.Load ("Three");
    
    		//加载
    		yield return Instantiate (one);
    		yield return Instantiate (two);
    		yield return Instantiate (three);
    		bundle.assetBundle.Unload (false);
    	}
    }
    



    展开全文
  • 最近一个项目要用到批量的设置AB包名,由于同一类的资源在一个文件夹内,所以就查着资料写了一个小工具,以文件夹为单位批量修改内部的资源包名,方便打包,话不多说直接上代码吧: using System; using System....

             最近一个项目要用到批量的设置AB包名,由于同一类的资源在一个文件夹内,所以就查着资料写了一个小工具,以文件夹为单位批量修改内部的资源包名,方便打包,话不多说直接上代码吧:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using UnityEditor;
    using UnityEngine;
    
    public class SetAssetBundleName : EditorWindow
    {
        //******系统设置
        //一种系统样式,使用他可以使控件周围表现为一个BOX的模样
        private GUIStyle _box = new GUIStyle("Box");
    
        //******窗口参数
        private Vector2 _FilesScrollValue;//当前文件滚动的位置
    
        //******资源参数
        static List<stru_FileInfo> list_Files;//文件列表
    
        string assetBundleName;
        string assetBundleVariant = "";
        //int indentation;//缩进等级
        struct stru_FileInfo
        {
            public string fileName;
            public string filePath;//绝对路径
            public string assetPath;//U3D内部路径
            public Type assetType;
        }
        
        [MenuItem("Assets/AssetBundle工具箱/设置AB包名")]
        private static void OpenSetAssetBundleNameWindow()
        {
            list_Files = new List<stru_FileInfo>();
            //indentation = 1;
            CheckFileSystemInfo();
            SetAssetBundleName ABNameWin = GetWindow<SetAssetBundleName>("设置AssetBundlesName");
            ABNameWin.position = new Rect(300, 100, 300,500);
            ABNameWin.minSize = new Vector2(300, 500);
            ABNameWin.Show();
        }
        private void OnGUI()
        {
            //设置GUI label参数
            GUI.skin.label.fontSize = 10;
            GUI.skin.label.alignment = TextAnchor.MiddleLeft;
            FilesGUI();
            SetABNameGUI();
        }
        void FilesGUI()
        {
            //标题
            GUILayout.Space(5);
            EditorGUILayout.BeginHorizontal();
            GUILayout.Space(150);
            if (GUILayout.Button("刷新资源", _box))
            {
                list_Files.Clear();
                CheckFileSystemInfo();
            }
            EditorGUILayout.EndHorizontal();
    
            GUI.Label(new Rect(5, 35, 100, 20), "选中" + list_Files.Count + "项资源:");
            GUILayout.Space(10);
    
            _FilesScrollValue = EditorGUILayout.BeginScrollView(_FilesScrollValue, _box, GUILayout.MaxHeight(300));
            AddFileGUIToScroll();
            EditorGUILayout.EndScrollView();
    
            //GUI.EndGroup();
        }
        /// <summary>
        /// 绘制选中的文件资源到滑块
        /// </summary>
        void AddFileGUIToScroll()
        {
            foreach (stru_FileInfo file in list_Files)
            {
                // 开启一行
                GUILayout.BeginVertical();
                //获取系统中的文件夹图标
                GUIContent content = EditorGUIUtility.ObjectContent(null, file.assetType);
                content.text = file.fileName;
                //以lable展示
                GUILayout.Label(content, GUILayout.Height(20));
                
                GUILayout.EndVertical();
            }
        }
        void SetABNameGUI()
        {
            EditorGUILayout.BeginVertical();
            //设置包名
            GUILayout.Space(20);
            EditorGUILayout.BeginHorizontal();
            assetBundleName = EditorGUILayout.TextField("要设置的包名:", assetBundleName);
            EditorGUILayout.EndHorizontal();
            //设置AB版本
            EditorGUILayout.BeginHorizontal();
            assetBundleVariant = EditorGUILayout.TextField("资源拓展名:", assetBundleVariant);
            EditorGUILayout.EndHorizontal();
    
            //确定设置
            GUILayout.Space(20);
            if (GUILayout.Button("确定"))
            {
                for(int a =0;a < list_Files.Count; a++)
                {
                    SetBundleName(list_Files[a].assetPath);
                }
            }
            EditorGUILayout.EndVertical();
    
            //GUI.EndGroup();
        }
        #region 设置选中文件夹下的所有对象的assetBundle的名字
        /// <summary>
        /// 检查文件系统下的信息
        /// </summary>
        private static void CheckFileSystemInfo()
        {
            AssetDatabase.RemoveUnusedAssetBundleNames();//移除无用的AssetBundleName
    
            UnityEngine.Object obj = Selection.activeObject;    //选中的物体
            string path = AssetDatabase.GetAssetPath(obj);//选中的文件夹
    
            CoutineCheck(path);
        }
        /// <summary>
        /// 是文件,继续向下
        /// </summary>
        /// <param name="path"></param>
        private 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  文件系统,加相对路径
                }
            }
    
        }
        /// <summary>
        /// 判断是文件还是文件夹,是文件的话加入列表
        /// </summary>
        /// <param name="fileSystemInfo"></param>
        /// <param name="path"></param>
        private static void CheckFileOrDirectory(FileSystemInfo fileSystemInfo, string path)
        {
            FileInfo fileInfo = fileSystemInfo as FileInfo;
            if (fileInfo != null)
            {
                //Debug.Log(fileInfo.Name);//文件名
                //Debug.LogWarning(fileInfo.FullName);//路径带文件名
                //Debug.LogError(fileInfo.DirectoryName);//上级路径
                stru_FileInfo t_file = new stru_FileInfo();
                t_file.fileName = fileInfo.Name;
                t_file.filePath = fileInfo.FullName;
                t_file.assetPath = "Assets" + fileInfo.FullName.Replace(Application.dataPath.Replace("/", "\\"), "");//用于下一步获得文件类型
                t_file.assetType = AssetDatabase.GetMainAssetTypeAtPath(t_file.assetPath);
                t_file.assetPath = path;
                list_Files.Add(t_file);
            }
            else
            {
                CoutineCheck(path);
            }
        }
        /// <summary>
        /// 设置assetbundle名字
        /// </summary>
        /// <param name="path"></param>
        private void SetBundleName(string path)
        {
            var importer = AssetImporter.GetAtPath(path);
            string[] strs = path.Split('.');
            string[] dictors = strs[0].Split('/');
            if (importer != null)
            {
                if (assetBundleVariant != "")
                {
                    importer.assetBundleVariant = assetBundleVariant;
                }
                if(assetBundleName != "")
                {
                    importer.assetBundleName = dictors[dictors.Length - 2] + "/" + assetBundleName;
                }
            }
            else
                Debug.Log("importer是空的");
        }
    
        #endregion
    }
    

    使用方法即使选中要修改 的文件夹右键,或者在工具栏里点击Assets --->AssetBundle工具箱---> 设置AB包名,即可!

    注意包号assetBundleVariant可为空,也可以自己输入,个人理解是区分相同资源的不同版本···有点绕············

    展开全文
  • Unity3D AssetBundle的打包和加载 目录 1、博文介绍 2、具体思路和写法 (1)AB包的打包 (2)AB包的加载 (3)AB包卸载 3.资源包下载 4.推送 5.结语 1、博文介绍 本篇博客主要起记录和学习作用,简单...
  • 今天我们来说说通过反编译Unity3D的AssetBundle来提取游戏资源,博主写这篇文章的目的并非是要教大家如何去破解一款基于Unity3D引擎开发的游戏,而是想通过今天这篇文章来告诉大家如何在开发Unity3D游戏的过程中保护...
  • 前言本系列将会从零开始开发一个轻量级的AB包编辑器工具(也就是打包或者管理AssetBundle的工具),完成以后,他的最终应用界面可能是如下这样的:界面详解: 1、Create:创建一个新的空的AB包; 2、Rename:...
  • 两种方法: 恺撒加密解密、AES加密解密 https://blog.csdn.net/weixin_39766005/article/details/103990313
  • unity3D使用dll打包

    2015-09-06 19:07:36
    unity中有些时候有些代码是一整套的,如果能把他们归类起来作为一个文件整个代码结构看起来就会整洁清爽很多。c#提供了dll打包,但是unity中由于涉及到unity的自身dll,如UnityEngine.dll,我们一般写的很多代码都会...
  • 翻了翻如何打AB包,并在加载服务器,没有找到合适的文章。靠人不如靠己,自己动手丰衣足食。Unity版本2018.1.1 1、制作AB包 直接上代码 using UnityEngine; using UnityEditor; using System.IO; /// <summary>...
  • unity中创建一个Cube,设置成预制体,生成AssetBundle中AB包,生成包代码如下: BuildPipeline.BuildAssetBundles(dir,BuildAssetBundleOptions.None ,BuildTarget.StandaloneWindows64);参数分别为:地址,压缩...
  • Unity WegGL IIS ab包

    2018-05-22 16:51:06
    1.实现的效果我想实现一个unity发布成WebGL后加载ab包的效果,将ab包和WebGL部署到IIS上。这些博客都太有用了,谢谢分享的人。webgl iis部署 CORS缺少 这个问题没有遇到 大致如下,按照步骤来应该是可以配置加载...
  • 1、打包场景(转) 把场景文件打包成 .unity3d 后缀的文件。using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class PackAB { #if UNITY_EDITOR ...
  • using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; using UnityEngine.Networking; public class LoadAssetBundle : MonoBehaviour ... private string PathURL;...
  • 打包代码,要放在\Assets\Editor 的目录下,就会在菜单Assets 增加了一个打包的 功能 Build ...using UnityEditor; using UnityEngine; public class BuildAB : MonoBehaviour { //[MenuItem("AssetBund...
  • Unity3d发布WebGL打包AssetBundle的材质球丢失问题 出现材质球丢失的问题,网上的解决方案都是: Edit——>Project Setting——>Graphics 在Always Included Shaders中 是Unity默认打包的材质球类型 但是会...
1 2 3 4 5 ... 20
收藏数 1,975
精华内容 790
热门标签