Unity自定义菜单创建项目结构后自动删除自身脚本失效如何解决
问题原因
- 资源删除方式错误:直接使用
File.Delete操作Unity资产目录下的文件不符合规范,Unity会维护自身的资产数据库索引,直接操作磁盘文件容易出现文件锁定、索引未同步的问题,且不会自动删除对应的.meta文件,会残留冗余文件。 - 代码结构缺失:你提供的代码片段缺少方法闭合的
},且未引入必要的命名空间(UnityEditor、System.IO、System等),本身可能无法正常编译执行。 - 多余无效代码:
AssetDatabase.GUIDToAssetPath(folders);一行既没有赋值也没有逻辑判断,属于无效代码。
修正后完整代码
using System; using System.IO; using UnityEditor; using UnityEngine; public class Organize : Editor { [MenuItem("Unity/Create structure")] static void CreateFolder() { var items = new string[] { "Sprites", "Scripts", "Animation", "Materials", "Prefabs", "Media", "Plugins", "Models", "Textures", "Shaders" }; Array.Sort(items); foreach (var item in items) { // 已存在的文件夹不会重复创建,避免报错 if (!AssetDatabase.IsValidFolder($"Assets/{item}")) { AssetDatabase.CreateFolder("Assets", item); } } // 优先使用Unity官方API删除资产,自动同步索引、删除对应meta文件 bool deleteResult = AssetDatabase.DeleteAsset("Assets/Organize.cs"); // 兜底方案:API删除失败时直接操作磁盘文件 if (!deleteResult) { File.Delete($"{Application.dataPath}/Organize.cs"); File.Delete($"{Application.dataPath}/Organize.cs.meta"); } AssetDatabase.Refresh(); } }
注意事项
- 确保脚本名称为
Organize.cs,且确实存放在Assets根目录下,如果放在子目录(比如Assets/Editor),需要把删除路径对应修改为Assets/Editor/Organize.cs - 因为用到了
UnityEditor命名空间下的API,建议将脚本放在Editor目录下,避免项目打包时出现引用报错。
内容的提问来源于stack exchange,提问作者edu
相关产品推荐
相关产品推荐

