全面整合U3D
优质学习资源站

如何在Unity主菜单中添加自定义菜单和自定义功能

每次创建项目都要重新创建项目目录结构,比较麻烦,所以想在主菜单中,增加一个一级菜单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;
        }
    };
}
未经允许不得转载:Unity爱好者 » 如何在Unity主菜单中添加自定义菜单和自定义功能

评论 抢沙发

评论前必须登录!