简单的打包小工具

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

public class PackageAssetBundle : EditorWindow {

string path;
string packagePath;
static string fullPath;

static List<string> assetsPath = new List<string>();
bool[] flags = new bool[assetsPath.Count];
Vector2 scallPos;

private BuildAssetBundleOptions buildOption = BuildAssetBundleOptions.None;
private BuildTarget targetPlatForm = BuildTarget.StandaloneWindows64;

[MenuItem("AssetBundle/Build")]
static void Init () {
//得到打包资源文件夹所有名字
GetLeftNames();
//创建窗口对象
PackageAssetBundle window = EditorWindow.GetWindow (typeof(PackageAssetBundle),utility:false,title:"My Window",focus:true) as PackageAssetBundle;
//显示窗口
window.Show ();
}

void OnEnable()
{
GUIContent title = new GUIContent("My Window");
this.titleContent = title;
}

enum PackageStyle
{
BUILD_ALL_IN_ONE_FOLDER, //分开打包
BUILD_ALL_IN_AN_ASSETBUNDLE //打进一个包
}

private PackageStyle style = PackageStyle.BUILD_ALL_IN_AN_ASSETBUNDLE;
private string packageName;
private void OnGUI()
{
TopBuildPath();
GetLeftLable();
buildOption = (BuildAssetBundleOptions)EditorGUILayout.EnumPopup("Build Option:", buildOption);
targetPlatForm = (BuildTarget)EditorGUILayout.EnumPopup("Build PlatForm", targetPlatForm);
GetBundleLable();
BuildORCancle();
}

void BuildORCancle()
{
GUILayout.BeginHorizontal();
if (GUILayout.Button("取消", GUILayout.Width(80)))
{
this.Close();
}
if (GUILayout.Button("打包", GUILayout.Width(80)))
{
bool canPackage = true;
if (packagePath == null || packagePath.Length <= 0 || !Directory.Exists(packagePath))
{
canPackage = false;
EditorApplication.Beep(); //不能打包就会发出声音
}
List<string> selectedAssets = new List<string>();
int count = 0;
foreach (var go in assetsPath)
{
if (flags[count])
{
selectedAssets.Add(fullPath + go);
}
count++;
}
if (selectedAssets == null || selectedAssets.Count <= 0)
{
canPackage = false;
EditorApplication.Beep();
}
if (canPackage)
{
switch (style)
{
case PackageStyle.BUILD_ALL_IN_ONE_FOLDER: //分开打包
PackageBundleSelected(packagePath, selectedAssets.ToArray());
break;
case PackageStyle.BUILD_ALL_IN_AN_ASSETBUNDLE: //打进一个包
PackageBundleAll(packagePath, selectedAssets.ToArray());
break;
default:
break;
}
this.Close();
}
}
GUILayout.EndHorizontal();
}

void PackageBundleAll(string packagePath, string[] selectedAssets)
{
if (packagePath.Length <= 0 || !Directory.Exists(packagePath))
return;
AssetBundleBuild[] buildMap = new AssetBundleBuild[1];//将选中对象一起打包
buildMap[0].assetBundleName = packageName;
buildMap[0].assetNames = selectedAssets;
AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(packagePath, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
AssetDatabase.Refresh();
if (manifest == null)
Debug.LogError("Package AssetBundles Faild.");
else
Debug.Log("Package AssetBundles Success.");
}

void PackageBundleSelected(string packagePath, string[] selectedAssets)
{
if (packagePath.Length <= 0 || !Directory.Exists(packagePath))
return;
AssetBundleBuild[] buildMap = new AssetBundleBuild[selectedAssets.Length];
for (int i = 0; i < selectedAssets.Length; i++)
{
string[] str = new string[] { selectedAssets[i] }; //提出每次选择的路径
buildMap[i].assetBundleName = selectedAssets[i].Split('/')[2].Split('.')[0];
buildMap[i].assetNames = str;
}
foreach (var item in selectedAssets)
{
Debug.Log(item);
}
AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(packagePath, buildMap, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
AssetDatabase.Refresh();
if (manifest == null)
Debug.LogError("Error:Package Failed");
else
Debug.Log("Package Success");
}

void GetBundleLable()
{
GUILayout.Space(10);
GUILayout.BeginVertical(GUILayout.Height(50));
style = (PackageStyle)EditorGUILayout.EnumPopup("Package Style:", style);
if (style==PackageStyle.BUILD_ALL_IN_AN_ASSETBUNDLE)
{
packageName = EditorGUILayout.TextField("Package Name:", packageName);
}
GUILayout.EndVertical();
}

void TopBuildPath()
{
GUILayout.BeginHorizontal();
path = EditorGUILayout.TextField("Build path", path);
if (GUILayout.Button("...", GUILayout.Width(30), GUILayout.Height(14)))
{
packagePath = EditorUtility.SaveFolderPanel("Select Build Path", "F:/", "");
path = packagePath;
}
GUILayout.EndHorizontal();
}

static void GetLeftNames()
{
fullPath = "Assets/Prefabs/";
if (assetsPath.Count > 0)
{
assetsPath.Clear();
}
if (Directory.Exists(fullPath))
{
DirectoryInfo directory = new DirectoryInfo(fullPath);
FileInfo[] files = directory.GetFiles("*", SearchOption.AllDirectories);

for (int i = 0; i < files.Length; i++)
{
if (files[i].Name.EndsWith(".meta"))
{
continue;
}
assetsPath.Add(files[i].Name);
}
}
}

void GetLeftLable()
{
GUILayout.Space(20);
GUILayout.Label("Select the Files you want to package:");
scallPos = EditorGUILayout.BeginScrollView(scallPos, GUILayout.Height(300));
for (int i = 0; i < assetsPath.Count; i++)
{
string lable = Path.GetFileName(assetsPath[i]);
flags[i] = EditorGUILayout.ToggleLeft(lable, flags[i]);
}
EditorGUILayout.EndScrollView();
}
}

猜你喜欢

转载自www.cnblogs.com/huwenya/p/9263100.html