【Unity3D】自制小工具批量設置AB包名

         最近一個項目要用到批量的設置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可爲空,也可以自己輸入,個人理解是區分相同資源的不同版本···有點繞············

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章