每次创建项目都要重新创建项目目录结构,比较麻烦,所以想在主菜单中,增加一个一级菜单Tools菜单和一个二级菜单Project,具体命令CreateDirectoryWithTemple。点击CreateDirectoryWithTemple会创建一个标准的项目目录结构。最终效果如图:

创建的目录结构如下:

实现方法:
Step 1:创建C#脚本,引入命名空间UnityEditor,类继承Editor
Step 2:引入MenuItem属性, 属性把任意静态函数变为一个菜单命令
MenuItem(string itemName, bool isValidateFunction, int priority) itemName:菜单名称路径.具体格式 "一级菜单/二级菜单/..。/菜单命令" isValidateFunction:默认false。如果设置为true则点击菜单前会调用 priority:显示排序
Step 3:实现创建目录的逻辑
源码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
/*
项目创建相关的工具放在这个里面
*/
public class ProjectCreate : Editor
{
/**
* 创建项目目录结构
*/
[MenuItem("Tools/Project/CreateDirectoryWithTemple")]
static void createDirectoryWithTemple()
{
//获取当前项目路径
string assetsPath = Application.dataPath;
Debug.Log("项目路径:"+assetsPath);
//组织目录结构
List<ProjectDirectory> directoryList = getDirectoryList();
//创建目录
createDirectory(assetsPath, directoryList);
}
/**
* 创建目录
*/
static void createDirectory(string parentDirectoryPath, List<ProjectDirectory> directoryList) {
//循环创建目录
foreach (ProjectDirectory directory in directoryList)
{
//组织目录路径
string currentDirectory = parentDirectoryPath +"/"+ directory.Name;
//创建当前目录
if (!System.IO.Directory.Exists(currentDirectory))
{
System.IO.Directory.CreateDirectory(currentDirectory);
Debug.Log("创建目录:" + currentDirectory);
}
//创建子目录
if (directory.SubDirectoryList != null)
{
createDirectory(currentDirectory, directory.SubDirectoryList);
}
}
}
/**
* 生成目录结构
*/
static List<ProjectDirectory> getDirectoryList()
{
List<ProjectDirectory> directoryList = new List<ProjectDirectory>();
//作为动态添加Unity编辑器功能的脚本来编译。在该文件夹和其子文件夹的脚本不能被添加到GameObject上
List<ProjectDirectory> editorSubDirectoryList = new List<ProjectDirectory>();
//editor ab包自动打包和版本管理相关工具
editorSubDirectoryList.Add(new ProjectDirectory("AssetBundle", null));
//editor Protocal协议相关工具
editorSubDirectoryList.Add(new ProjectDirectory("Protocal", null));
directoryList.Add(new ProjectDirectory("Editor", editorSubDirectoryList));
//场景面板中的图标图片资源
directoryList.Add(new ProjectDirectory("Gizmos", null));
//插件资源,包括用C/C++编写的Dll库
directoryList.Add(new ProjectDirectory("Plugins", null));
//存放需要通过代码初始化/使用的资源,可以放在工程中的任意文件夹中,在Resources文件夹中的文件可以通过Resources.Load来读取
directoryList.Add(new ProjectDirectory("Resources", null));
//场景文件
directoryList.Add(new ProjectDirectory("Scenes", null));
//存放打包以后的ab资源包
directoryList.Add(new ProjectDirectory("SteammingAssets", null));
//临时文件
directoryList.Add(new ProjectDirectory("Temp", null));
//配置文件
directoryList.Add(new ProjectDirectory("Settings", null));
//脚本目录
List<ProjectDirectory> scriptsSubDirectoryList = new List<ProjectDirectory>();
//Scripts Common公用脚本目录
scriptsSubDirectoryList.Add(new ProjectDirectory("Common", null));
//Scripts Scene具体场景脚本目录
scriptsSubDirectoryList.Add(new ProjectDirectory("Scene", null));
//Scripts network目录
scriptsSubDirectoryList.Add(new ProjectDirectory("Network", null));
//Scripts Lua目录
scriptsSubDirectoryList.Add(new ProjectDirectory("Lua", null));
directoryList.Add(new ProjectDirectory("Scripts", scriptsSubDirectoryList));
//GameAssets为美术,特效,声音,贴图,配置等文件
List<ProjectDirectory> gameAssetsSubDirectoryList = new List<ProjectDirectory>();
//GameAssets 材质
gameAssetsSubDirectoryList.Add(new ProjectDirectory("Materials", null));
//GameAssets 模型
gameAssetsSubDirectoryList.Add(new ProjectDirectory("Models", null));
//GameAssets 贴图
gameAssetsSubDirectoryList.Add(new ProjectDirectory("Textures", null));
//GameAssets 预制体
gameAssetsSubDirectoryList.Add(new ProjectDirectory("Prefabs", null));
//GameAssets 音效
gameAssetsSubDirectoryList.Add(new ProjectDirectory("Sounds", null));
//GameAssets UI
gameAssetsSubDirectoryList.Add(new ProjectDirectory("UI", null));
//GameAssets 动画
gameAssetsSubDirectoryList.Add(new ProjectDirectory("Animations", null));
directoryList.Add(new ProjectDirectory("GameAssets", gameAssetsSubDirectoryList));
return directoryList;
}
class ProjectDirectory
{
public string Name { get; set; }
public List<ProjectDirectory> SubDirectoryList { get; set; }
public ProjectDirectory(string name, List<ProjectDirectory> directoryList)
{
this.Name = name;
this.SubDirectoryList = directoryList;
}
};
}
评论前必须登录!
注册