通过输入ab包名和后缀名自动添加或修改ab包名(同一文件夹下的所有文夹都会被修改包括子文件夹)

说明

temp = temp.Substring(temp.IndexOf("Assets"));

这段代码主要是获取的文件路径为完整路径,而AssetImporter.GetAtPath(fl);所需要的路径不需要完整路径,只需要Asset下的路径即可,所以这里需要截取路径

完整代码

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

public class SetGoAssertBundleName : EditorWindow {
    //文件夹名字
    string DictorName = "";
    //ab包名字
    string abName = "sound";
    //后缀名
    string VariantName = "unity3d";
    List<string> files = new List<string>();
    //打开窗口
    [MenuItem("Tools/SetAssertBundleName")]
    public static void GetWidow()
    {
        EditorWindow.GetWindow<SetGoAssertBundleName>(false, "批量设置AB包名字", true);
    }
    private void OnGUI()
    {
        EditorGUILayout.LabelField("批量修改AB包名");
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("选择文件夹");
        //得到文件夹下的名字
        if(GUILayout.Button("选择文件夹"))
        {
            string temp = EditorUtility.OpenFolderPanel("选择文件夹", Application.dataPath,"");
            if (!string.IsNullOrEmpty(temp))
            {
                temp = temp.Substring(temp.IndexOf("Assets"));
                DictorName = temp;
            } 
        }
        //输入包名
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("输入包名");
        abName = EditorGUILayout.TextField(abName);
        EditorGUILayout.EndHorizontal();

        //输入后缀名
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("输入后缀名");
        VariantName = EditorGUILayout.TextField(VariantName);
        EditorGUILayout.EndHorizontal();
        if (GUILayout.Button("设置ab包名"))
        {
            if (string.IsNullOrEmpty(DictorName)) return; 
            GetAllFiles(files, DictorName);
            foreach (string fl in files)
            {
                Debug.Log(fl);
                var import = AssetImporter.GetAtPath(fl);
                if (import != null)
                {
                    import.assetBundleName = abName;
                    import.assetBundleVariant= VariantName;
                }
                else
                    Debug.Log("import=null");
            } 
        }
    }
    //获取文件夹下所有的文件 .meta文件除外
    static void GetAllFiles(List<string> files, string dir)
    {
        string[] fls = Directory.GetFiles(dir);
        foreach (string fl in fls)
        {
            string extension = Path.GetExtension(fl);
            if (extension != ".meta")
            {
                files.Add(fl);
            }
        }
        string[] subDirs = Directory.GetDirectories(dir);
        foreach (string subDir in subDirs)
        {
            GetAllFiles(files, subDir);
        }
    }
}

<think>嗯,用户问的是关于Unity中通过AssetBundle加载资源的问题,特别是当AB资源目录下有文件夹时,应该用资源字加载还是路径加载。我需要先回忆一下AssetBundle的加载机制。 首先,我记得UnityAssetBundle的时候,资源在项目中的路径会影响打后的AssetBundle结构。如果资源放在文件夹里,打时可能需要设置AssetBundle的变体。不过用户的问题是关于加载时的处理,即加载的时候是否需要考虑文件夹的路径。 然后,想到AssetBundle.LoadAsset方法,这个方法通常是根据资源的称来加载的,而不是路径。也就是说,无论资源在项目中的哪个文件夹下,只要打进了同一个AssetBundle,加载时只需要用资源字。不过这里可能有个前提,就是资源的称在AssetBundle内是唯一的,否则可能会有冲突。 不过,也有可能用户的情况是,资源被打到不同的AssetBundle中,这时候可能需要通过路径来指定具体的AssetBundle件。比如,如果文件夹被单独打成不同的AssetBundle,那么加载的时候需要指定那个AssetBundle的路径称,然后再用资源加载具体资源。 可能需要区分两种情况:一种是资源在同一个AssetBundle中的文件夹结构,另一种是文件夹被打成不同的AssetBundle。如果是前者,文件夹结构在打后可能被忽略,资源只是根据;如果是后者,需要加载不同的AssetBundle,每个对应文件夹。 另外,Unity在打时,如果选择按照文件夹结构来打,可能需要设置每个文件夹为一个AssetBundle,这时候加载的时候需要分别加载每个文件夹对应的AssetBundle,然后再用资源加载资源。如果所有文件夹的资源都打到一个AssetBundle中,那么加载时只需要资源,路径可能被忽略。 不过,可能有一些特殊情况,比如资源称相同但路径不同,这时候打同一个AssetBundle中会导致冲突,所以Unity可能会自动处理为不同的称,者在加载时需要指定路径。但根据官方档,通常AssetBundle.LoadAsset使用的是资源的称,而不是路径。 需要确认Unity在打时如何处理资源的路径信息。例如,如果一个资源位于Assets/Resources/Subfolder/MyPrefab.prefab,并且被打同一个AssetBundle中,那么加载时是否需要使用"MyPrefab"还是"Subfolder/MyPrefab"。根据经验,应该是"MyPrefab",因为Unity在打时会将资源称作为唯一标识,而忽略路径结构,除非在打时显式设置了不同的AssetBundle称。 总结一下,用户的问题核心在于文件夹结构是否影响加载时的资源称。正确的做法应该是通过资源称加载,而不是路径,前提是这些资源被打同一个AssetBundle中。如果文件夹被打成不同的AssetBundle,则需要先加载对应的AssetBundle,然后再用资源加载资源。 另外,可能需要提醒用户注意AssetBundle的依赖关系,如果文件夹中的资源引用了其他AssetBundle中的资源,需要先加载依赖项。不过这可能超出了当前问题的范围。 最后,应该给出一个明确的步骤说明,比如如何设置AssetBundle的称,如何加载,以及示例代码,这样用户能更清楚地理解。</think>在Unity中通过AssetBundle加载资源时,**文件夹路径不会直接影响资源加载方式**,而是由以下两个核心因素决定: --- ### **1. AssetBundle打规则** - **关键原则**:Unity的AssetBundle打以`AssetBundle称`为核心,与资源在项目中的物理路径无关。 - **文件夹的处理**: - 如果文件夹内的资源被打到**同一个AssetBundle**中,加载时仅需资源称。 - 如果文件夹被标记为**不同的AssetBundle**,则需要分别加载每个AssetBundle。 --- ### **2. 资源加载方式** #### **场景1:文件夹资源打同一个AssetBundle** - **打设置**:将文件夹内的资源标记为同一个AssetBundle称(如 `mybundle`)。 - **加载代码**: ```csharp // 加载AssetBundle(路径为AB件在服务器的位置) AssetBundle bundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "mybundle")); // 加载资源(仅需资源称,无需文件夹路径) GameObject obj = bundle.LoadAsset<GameObject>("MyPrefab"); ``` #### **场景2:文件夹资源打到不同AssetBundle** - **打设置**:为每个文件夹单独标记AssetBundle称(如 `subfolder1/bundle1` `subfolder2/bundle2`)。 - **加载代码**: ```csharp // 加载文件夹对应的AssetBundle AssetBundle bundle1 = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "subfolder1/bundle1")); AssetBundle bundle2 = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "subfolder2/bundle2")); // 分别加载资源 GameObject obj1 = bundle1.LoadAsset<GameObject>("ResourceInSubfolder1"); GameObject obj2 = bundle2.LoadAsset<GameObject>("ResourceInSubfolder2"); ``` --- ### **注意事项** 1. **资源称唯一性**:同一AssetBundle内的资源称必须唯一,否则会覆盖。 2. **依赖关系**:若文件夹资源引用其他AssetBundle中的资源,需先加载依赖的AssetBundle。 3. **路径无关性**:资源加载时仅依赖AssetBundle资源称,与原始项目路径无关。 --- ### **总结** - **资源加载依据**:由**AssetBundle称****资源称**共同决定,与文件夹路径无关。 - **开发建议**:通过脚本统一管理AssetBundle命规则,避免手动操作导致路径混乱。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值