[原]在Unity中创建可远程加载的.unity3d包
在一个Unity项目中,发布包本身不一定要包括所有的Asset(译为资产或组件),其它的部分可以单独发布为.unity3d,再由程序从本地/远程加载执行,这部分不在本文讨论范围。虽然Unity并没有直接提供.unity3d的导出功能,但可以通过其手册了解到一些,并打开菜单项。
翻看Unity关于AssetBundle的手册,有相关的链接:
【注意】导出.unity3d格式需要pro版本,非pro版本可以打开菜单项,但导出时会提示错误:
我们可以使用Untiy提供的现成的脚本打开两个导出.unity3d的菜单项,也可以使用API根据自己的需求来写。当项目变得越来越大时,手工导出AssetBundle会越来越吃力,这时可能就需要自己来开发导出功能,自动创建AssetBundle了。
打开菜单项
在Unity中创建名为ExprotAssetBundles的C#脚本,放到Editor目录下(必须是这个目录,以便在编辑器中生效)。把下面的代码复制到ExprotAssetBundles脚本中(可以在Building AssetBundles中找到这段代码)
1 // C# Example 2 // Builds an asset bundle from the selected objects in the project view. 3 // Once compiled go to "Menu" -> "Assets" and select one of the choices 4 // to build the Asset Bundle 5 6 using UnityEngine; 7 using UnityEditor; 8 public class ExportAssetBundles { 9 [MenuItem("Assets/Build AssetBundle From Selection - Track dependencies")] 10 static void ExportResource () { 11 // Bring up save panel 12 string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d"); 13 if (path.Length != 0) { 14 // Build the resource file from the active selection. 15 Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); 16 BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets); 17 Selection.objects = selection; 18 } 19 } 20 [MenuItem("Assets/Build AssetBundle From Selection - No dependency tracking")] 21 static void ExportResourceNoTrack () { 22 // Bring up save panel 23 string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d"); 24 if (path.Length != 0) { 25 // Build the resource file from the active selection. 26 BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path); 27 } 28 } 29 }
这时,在Assets菜单下可以看到两个新的菜单项:
1. Build AssetBundle From Selection - Track dependencies
如何在创建组件包时修改属性
可以在调用 BuildPipeline.BuildAssetBundle以后使用 AssetDatabase.ImportAsset来强制导入组件,然后用 AssetPostprocessor.OnPreprocessTexture来设置需要的属性。
下面的示例来展示构建组件包时如何设置不同的纹理贴图。
1 // Builds an asset bundle from the selected objects in the project view, 2 // and changes the texture format using an AssetPostprocessor. 3 4 using UnityEngine; 5 using UnityEditor; 6 7 public class ExportAssetBundles { 8 9 // Store current texture format for the TextureProcessor. 10 public static TextureImporterFormat textureFormat; 11 12 [MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB2")] 13 static void ExportResourceRGB2 () { 14 textureFormat = TextureImporterFormat.PVRTC_RGB2; 15 ExportResource(); 16 } 17 18 [MenuItem("Assets/Build AssetBundle From Selection - PVRTC_RGB4")] 19 static void ExportResourceRGB4 () { 20 textureFormat = TextureImporterFormat.PVRTC_RGB4; 21 ExportResource(); 22 } 23 24 static void ExportResource () { 25 // Bring up save panel. 26 string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d"); 27 28 if (path.Length != 0) { 29 // Build the resource file from the active selection. 30 Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); 31 32 foreach (object asset in selection) { 33 string assetPath = AssetDatabase.GetAssetPath((UnityEngine.Object) asset); 34 if (asset is Texture2D) { 35 // Force reimport thru TextureProcessor. 36 AssetDatabase.ImportAsset(assetPath); 37 } 38 } 39 40 BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets); 41 Selection.objects = selection; 42 } 43 } 44 } 45 46 // Changes the texture format when building the Asset Bundle. 47 using UnityEngine; 48 using UnityEditor; 49 public class TextureProcessor : AssetPostprocessor 50 { 51 void OnPreprocessTexture() { 52 TextureImporter importer = assetImporter as TextureImporter; 53 importer.textureFormat = ExportAssetBundles.textureFormat; 54 } 55 }
也可以使用AssetDatabase.ImportAssetOptions.来控制如何导入组件。
首发地址: http://www.cnblogs.com/basecn/archive/2013/05/20/3264297.html