打包文件夹下所有模型文件为.ab文件

Unity2017.3.1 + VS2017
需求:要做一个动态模型资源库模块,能够满足模型的动态加载、更换等功能。
思路:在Unity中一种模型文件夹包含所有fbx、Material、Texture等子文件夹,打包fbx文件夹为.ab文件,通过替换、加载本地.ab或服务器端.ab文件实现模型的动态加载和更换。
实现:
1.通过打包指定的文件夹下所有文件为.ab来实现;
2.直接打包fbx文件夹下所有文件为.ab来实现(注意:material必须从fbx中剥离出来)(相对1,减少了很多texture/material等文件打包进.ab)
3.通过打包模型的预制件为.ab来实现(相对1,可以关联动画控制器到模型的Animator上,一般带动画的模型fbx直接生成是没有动画控制器的,播放不了动画,只有一个Take001的动画片段在模型里,下一篇介绍怎么把模型自动生成连线好的动画控制器、预制件,且预制件上包含动画控制器)

具体实际的应用请自行发挥,更多相关代码,如果没有请自行百度。
ps:多查api,多在代码编写填参数时用DownArrow =_=

using System.IO;
using UnityEditor;
using UnityEngine;

public class AssetBundles {
	[MenuItem("Tools/Build AssetBundles")]
	public static void BuildAssetBundles() {
		ClearExitAssetBundleNames();

		Object[] arr = Selection.objects;
		if(arr.Length == 0) {
			Debug.Log("请选中Project视图的文件夹进行打包!");
		}

		for (int i = 0; i < arr.Length; i++) {
			string resPath = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')) + "/" + AssetDatabase.GetAssetPath(arr[i]);
			DirectoryInfo directoryInfo = new DirectoryInfo(resPath);
			string targetPath = Application.streamingAssetsPath + "/AssetBundles/" + directoryInfo.Name + "/AssetBundles";

			SetAssetBundleNames(directoryInfo);
			if (!Directory.Exists(targetPath)) {
				Directory.CreateDirectory(targetPath);
			}

			BuildPipeline.BuildAssetBundles(targetPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
			ClearExitAssetBundleNames();
			AssetDatabase.Refresh();
		}
	}

	/// 
	/// 文件名即AssetBundle名
	/// 
	/// 
	private static void SetAssetBundleNames(DirectoryInfo directoryInfo) {
		FileInfo[] fileInfos = directoryInfo.GetFiles();
		foreach(FileInfo fileInfo in fileInfos) {
			if (fileInfo.Extension != ".meta") {
				int index = fileInfo.FullName.IndexOf("Assets");
				string path = fileInfo.FullName.Substring(index);
				AssetImporter importer = AssetImporter.GetAtPath(path);
				importer.assetBundleName = fileInfo.Name.Split('.')[0] + ".ab";
			}
		}

		DirectoryInfo[] directoryInfos = directoryInfo.GetDirectories();
		foreach (DirectoryInfo dir in directoryInfos) {
			SetAssetBundleNames(dir);
		}
	}

	private static void ClearExitAssetBundleNames() {
		string[] names = AssetDatabase.GetAllAssetBundleNames();
		for(int i=0;i

你可能感兴趣的:(Unity,Editor,Plugins)