Unity Prefab批量修改

本文介绍了一个Unity编辑器扩展窗口的功能,用于批量修改Prefab文件,包括移除子物体和添加组件,然后将修改后的Prefab保存到新文件夹。文章详细解释了如何在Unity中使用相对路径和绝对路径,以及如何利用PrefabUtility进行Prefab的保存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面实现的一个功能是对一个文件夹下的所有prefab批量修改,比如移除某个子物体,添加一个组件等,然后保存到另一个新的文件夹下; 

如下,我们实现一个扩展窗口,用于选择源文件夹和目标文件夹;然后遍历所有的prefab,进行修改,然后保存到新文件夹下,在保存之前检查资源是否存在,如果已存在,就移除再保存新的;

首先,在unity内加载资源时用的是工程的相对路径,而对于C#的IO来说,需要用绝对路径,那么先提供一组相对路径和绝对路径之间的转换接口,如下所示,这里使用了正则替换,注意模式字符串要用@前缀标记为原义;

    public static string GetRelativePath(string path){
        string srcPath = path.Replace("\\", "/");
        var retPath =  Regex.Replace(srcPath, @"\b.*Assets", "Assets");
        return retPath;
    }
    public static string GetAbsolutePath(string path){
        string srcPath = path.Replace("\\", "/");
        var retPath =  Regex.Replace(srcPath, @"\b.*Assets", Application.dataPath);
        return retPath;
    }

 然后就是简单的编辑器扩展功能,这里要使用PrefabUtility来进行prefab的保存,而不能使用AssetDatabase的接口;

using UnityEngine;
using UnityEditor;
using System.IO;

public class ArtActorPrefabModifyWindow : EditorWindow
{
    public static string assetSrcFolderPath = Application.dataPath + "/Resources/Prefabs/FashionPartPrefab";
    public static string assetDstFolderPath = "Assets/Resources/Prefabs/FashionPartPrefabNew";
    [MenuItem ("====Tools====/Prefab/移除时装部件内的骨骼")]
    public static void ShowWindow () {
        EditorWindow thisWindow = EditorWindow.GetWindow(typeof(ArtActorPrefabModifyWindow));
        thisWindow.titleContent = new GUIContent("骨骼移除");
        thisWindow.position = new Rect(Screen.width/2, Screen.height/2, 600, 800);
    }

    void OnGUI()
    {
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("选择源文件夹");
        EditorGUILayout.TextField(assetSrcFolderPath);
        if (GUILayout.Button("选择"))
        {
            assetSrcFolderPath = EditorUtility.OpenFolderPanel("选择文件夹", assetSrcFolderPath, "");
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("选择源文件夹");
        EditorGUILayout.TextField(assetDstFolderPath);
        if (GUILayout.Button("选择"))
        {
            assetDstFolderPath = EditorUtility.OpenFolderPanel("选择文件夹", assetDstFolderPath, "");
        }
        EditorGUILayout.EndHorizontal();
 
        if (GUILayout.Button("开始提取") && assetSrcFolderPath != null && assetDstFolderPath != null)
        {
            Seperate();
        }
    }
    private static void Seperate(){
        assetSrcFolderPath = PathUtil.GetAbsolutePath(assetSrcFolderPath);
        var files = Directory.GetFiles(assetSrcFolderPath, "*.prefab");
        string dstPath = PathUtil.GetRelativePath(assetDstFolderPath);
        foreach (var file in files)
        {
            string srcPath = PathUtil.GetRelativePath(file);
            GameObject srcObj = AssetDatabase.LoadAssetAtPath(srcPath, typeof(GameObject)) as GameObject;
            if (srcObj == null)
                continue;

            GameObject dstObj = AssetDatabase.LoadAssetAtPath(dstPath, typeof(GameObject)) as GameObject;
            if (dstObj != null)
                AssetDatabase.DeleteAsset(dstPath);
            dstObj = GameObject.Instantiate(srcObj);
            Transform avatar = dstObj.transform.Find("Bip001");
            if (avatar != null) {
                GameObject.DestroyImmediate(avatar.gameObject);
                PrefabUtility.SaveAsPrefabAsset(dstObj, dstPath + "/" + srcObj.name + ".prefab");
            }
            GameObject.DestroyImmediate(dstObj);
        }
    }
}

 

<think>好的,我现在需要解决用户的问题:在Unity中如何批量修改文件名称。用户之前询问了Unity 2020.3.40f1版本的信息,现在转向文件管理的问题,可能是在项目开发中遇到了需要大量重命名资源的情况。我需要考虑用户可能的场景,比如游戏开发中需要规范命名资源,或者整理项目文件结构。 首先,用户可能已经知道如何手动重命名文件,但批量处理需要更高效的方法。Unity本身没有内置的批量重命名工具,所以可能需要使用扩展编辑器功能或者第三方工具。这时候,我应该想到Unity的AssetDatabase类和编辑器脚本,这是Unity提供的API,允许通过脚本操作资源。 接下来,用户可能不太熟悉编写编辑器脚本,所以需要给出具体的步骤和示例代码。同时,用户可能需要考虑安全操作,比如备份项目,避免重命名导致资源引用丢失。因此,在回答中应该提到备份的重要性。 另外,用户可能对第三方工具有兴趣,比如常用的Rename Editor或Asset Renamer,这些工具可能提供更友好的界面。需要简单介绍这些工具,并给出获取方式,比如Asset Store的链接。 还需要注意重命名后的文件可能导致场景或预制体中的引用丢失的问题。要提醒用户检查依赖项,或者确保重命名脚本正确处理元数据,避免引用断裂。可能还需要提到Unity的元文件(.meta)的作用,确保重命名时这些文件也同步更新,以保持GUID的一致性。 此外,用户可能需要批量重命名的规则,比如添加前缀、后缀,替换特定字符,或者按序列编号。在示例代码中应该展示这些常见需求,比如使用正则表达式替换,或者循环添加索引。 还要考虑不同操作系统的文件系统差异,比如Windows和Mac在处理文件时的路径问题,确保脚本中的路径处理是跨平台兼容的。 最后,总结步骤,强调备份、使用合适的方法(脚本或工具)、检查引用,确保用户操作安全有效。可能需要分点说明,结构清晰,便于用户跟随步骤操作。</think>在 Unity批量修改文件名称可以通过 **编辑器扩展脚本** 或 **第三方工具** 实现。以下是具体方法与详细步骤: --- ### **方法 1:使用 Unity 编辑器脚本(无需插件)** #### **步骤 1:创建编辑器脚本** 1. 在 `Assets/Editor` 目录下新建 C# 脚本 `BatchRenameTool.cs`。 2. 编写以下代码(支持**添加前缀/后缀/序号/替换字符**): ```csharp using UnityEditor; using UnityEngine; using System.IO; public class BatchRenameTool : EditorWindow { private string prefix = ""; private string suffix = ""; private string replaceOld = ""; private string replaceNew = ""; private int startNumber = 1; [MenuItem("Tools/Batch Rename")] public static void ShowWindow() { GetWindow<BatchRenameTool>("批量重命名"); } void OnGUI() { GUILayout.Label("批量重命名规则", EditorStyles.boldLabel); prefix = EditorGUILayout.TextField("前缀", prefix); suffix = EditorGUILayout.TextField("后缀", suffix); replaceOld = EditorGUILayout.TextField("替换原字符", replaceOld); replaceNew = EditorGUILayout.TextField("替换为新字符", replaceNew); startNumber = EditorGUILayout.IntField("起始序号", startNumber); if (GUILayout.Button("执行重命名")) { RenameSelectedAssets(); } } private void RenameSelectedAssets() { Object[] selectedObjects = Selection.objects; if (selectedObjects == null || selectedObjects.Length == 0) { Debug.LogError("未选中任何文件!"); return; } int counter = startNumber; foreach (Object obj in selectedObjects) { string path = AssetDatabase.GetAssetPath(obj); string dir = Path.GetDirectoryName(path); string oldName = Path.GetFileNameWithoutExtension(path); string extension = Path.GetExtension(path); // 应用替换规则 string newName = oldName; if (!string.IsNullOrEmpty(replaceOld)) { newName = newName.Replace(replaceOld, replaceNew); } newName = prefix + newName + suffix; // 添加序号(可选) if (startNumber > 0) { newName += $"_{counter}"; counter++; } string newPath = $"{dir}/{newName}{extension}"; AssetDatabase.RenameAsset(path, newName); } AssetDatabase.Refresh(); } } ``` #### **步骤 2:使用脚本** 1. 在 Project 窗口选中需要重命名的文件(支持多选)。 2. 顶部菜单栏选择 **Tools > Batch Rename**。 3. 设置规则后点击 **执行重命名**: - **前缀/后缀**:固定添加字符(如 "Enemy_") - **替换字符**:将文件名中的旧字符替换为新字符(如 "old" → "new") - **起始序号**:自动追加数字编号(如 "Item_1", "Item_2") --- ### **方法 2:使用第三方工具(推荐)** #### **工具 1:Rename Editor(免费)** - **功能**:支持正则表达式、序号填充、大小写转换。 - **安装**:在 Unity Asset Store 搜索并导入 [Rename Editor](https://assetstore.unity.com/packages/tools/utilities/rename-editor-19517)。 - **操作**: 1. 选中文件 → 右键选择 **Rename Editor**。 2. 使用 `%n` 表示原名称,`%i` 表示序号(如 `New_%n_%i`)。 #### **工具 2:Asset Renamer(付费)** - **优势**:支持批量修改子物体名称、预制体嵌套引用更新。 - **链接**:[Asset Renamer](https://assetstore.unity.com/packages/tools/utilities/asset-renamer-19514) --- ### **关键注意事项** 1. **备份项目**:重命名可能破坏场景或预制体中的引用。 2. **处理 .meta 文件**:Unity 会自动更新 .meta 文件中的 GUID,但需确保: - 不要手动删除 .meta 文件 - 重命名后通过 `AssetDatabase.Refresh()` 强制刷新 3. **引用修复**:若出现材质/脚本丢失,使用以下方法: - 手动重新关联 - 使用 **ReferenceFinder** 插件自动修复 --- ### **批量重命名典型场景示例** | 原始文件名 | 规则 | 结果文件名 | |-----------------|-------------------------|------------------| | sword.png | 前缀=`Icon_`, 后缀=`_01` | Icon_sword_01.png| | enemy_001.prefab| 替换 `enemy` → `boss` | boss_001.prefab | | item_???.asset | 序号起始=100 | item_100.asset | --- 通过以上方法,可高效完成 Unity 中资源的批量重命名操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值