using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
public class BundleBuilderActor : BundleBuilder
{
//[MenuItem("====Build Tools====/[3]打包 角色Actor 相关")]
public static void ShowWindow()
{
EditorWindow.GetWindow<BundleBuilderActor>(true);
}
/// <summary>滚动条坐标</summary>
private Vector2 scrollPos;
/// <summary>
/// Avatar预设文件夹,按照功能文件夹进行打包.
/// </summary>
private static string[] ActorAssetFoldersFiles = new string[]
{
"Assets/Content/Art/Avatar",
};
static string avatarEquipPath = "Assets/Content/Art/AvatarEquip/Prefabs";
private static string[] avatarCommonAssetsFolders = new string[]
{
"Assets/Content/Art/AvatarEquip/Equip/Common/Textures",
"Assets/Content/Art/AvatarEquip/Equip/Common/Materials",
// "Assets/Content/Art/AvatarEquip/Animator",
};
private static List<AssetEntry> allFolders = new List<AssetEntry>();
private static List<AssetEntry> allAvatarEquipFolders = new List<AssetEntry>();
private static string[] buildFolders;
static void ListAll()
{
allFolders.Clear();
foreach (string assetFolder in ActorAssetFoldersFiles)
{
foreach (string folder in Directory.GetDirectories(assetFolder, "*", SearchOption.AllDirectories))
{
allFolders.Add(new AssetEntry() { path = folder.Replace('\\', '/') });
}
}
//allFolders.Add(new AssetEntry() { path = "Assets/Content/Art/AvatarEquip/Prefabs".Replace('\\', '/') });
foreach (string folder in avatarCommonAssetsFolders)
{
foreach (string file in Directory.GetFiles(folder, "*", SearchOption.AllDirectories))
{
if (file.Contains(".meta"))
continue;
string patyhStr = file.Replace('\\', '/');
allFolders.Add(new AssetEntry { path = patyhStr });
}
}
foreach (string file in Directory.GetDirectories(avatarEquipPath, "*", SearchOption.AllDirectories))
{
string patyhStr = file.Replace('\\', '/');
if (patyhStr.Contains(".meta") || patyhStr.Contains("Temp"))
continue;
allFolders.Add(new AssetEntry { path = patyhStr });
Debug.LogError(patyhStr);
}
}
static void GetBuildFilesAndFolders()
{
// 需要生成的文件夹
List<AssetEntry> folders = allFolders.FindAll((entry) => { return entry.selected; });
buildFolders = new string[folders.Count];
for (int i = 0; i < folders.Count; ++i)
{
buildFolders[i] = folders[i].path;
}
}
static void Build()
{
// 没有需要生成的内容,退出
if (buildFolders.Length == 0)
return;
outputPath = FileSystem.PackagePath();
builds.Clear();
for (int i = 0; i < buildFolders.Length; ++i)
{
string[] files = System.Array.FindAll(Directory.GetFiles(buildFolders[i]), (file) =>
{
string ext = Path.GetExtension(file);
if (ext == ".meta" || ext == ".unity")
return false;
return true;
});
string pathName = buildFolders[i].Replace("Assets/Content/", "");
pathName = pathName.Replace("/", "").ToLower();
builds.Add(new AssetBundleBuild()
{
assetBundleName = pathName + ".unity3d",
assetNames = files,
}
);
}
//if (target != mBuildTarget)
//{
// EditorUserBuildSettings.SwitchActiveBuildTarget(target);
//}
string tempFolder = Application.dataPath + "/../BuildTemp" + "/ryzavatar";
DebugHelper.Log(tempFolder);
//if (Directory.Exists(tempFolder))
// Directory.Delete(tempFolder, true);
if (!Directory.Exists(tempFolder))
{
Directory.CreateDirectory(tempFolder);
}
AssetBundleManifest abm = BuildPipeline.BuildAssetBundles(tempFolder, builds.ToArray(),
BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.ChunkBasedCompression,
target);
if (abm)
{
DebugHelper.Log("<color=green>================ BuildActor Successsssssssssssssssss ================</color>");
//EditorUtility.DisplayDialog("", "Build Actor Completed", "OK");
}
else
{
DebugHelper.LogError("BuildActor Faileddddddddddddd");
//EditorUtility.DisplayDialog("", "Build Actor Failed", "OK");
}
FileSystem.CreateDirIfNotExist(outputPath);
foreach (string file in Directory.GetFiles(tempFolder))
{
if (Path.GetExtension(file) != ".manifest")
{
string des = Path.Combine(outputPath, Path.GetFileName(file));
if (File.Exists(des))
File.Delete(des);
File.Copy(file, des);
}
}
}
void OnEnable()
{
target = EditorUserBuildSettings.activeBuildTarget;// BuildTarget.Android;
titleContent = new GUIContent("Actor");
minSize = new Vector2(640f, 600f);
maxSize = new Vector2(640f, 1200f);
ListAll();
}
void OnGUI()
{
//BuildTargetSetting();
#region Avatar Prefabs;
GUILayout.Label("Avatar Prefabs", EditorStyles.boldLabel);
GUILayout.BeginHorizontal();
if (GUILayout.Button("Select All"))
{
SelectAll(allFolders);
}
if (GUILayout.Button("Unselect All"))
{
UnselectAll(allFolders);
}
GUILayout.EndHorizontal();
// 生成按钮
if (GUILayout.Button("Build"))
{
GetBuildFilesAndFolders();
Build();
}
scrollPos = GUILayout.BeginScrollView(scrollPos, GUILayout.Height(500));
foreach (var folder in allFolders)
{
folder.selected = GUILayout.Toggle(folder.selected, folder.path);
}
GUILayout.EndScrollView();
#endregion Avatar Prefabs;
}
public static void CommandBuild()
{
ListAll();
GetBuildFilesAndFolders();
Build();
}
}