[Unity] 添加新建Lua脚本选项

Unity 添加新建Lua脚本选项

最近学习Unity的XLua热更新框架的时候,会经常需要创建新的Lua脚本。然而,Unity本身不支持直接创建.lua后缀的文件,所以每次都必须手动在外部打开文件夹创建。

为了提高效率,就需要在Unity新建文件的菜单中添加了一个“新建Lua脚本”的选项。并且,要达到和“新建C#脚本”选项相同的效果:

  • 路径:在当前选中的文件夹下创建文件
  • 文件名:创建文件之后要默认处于重命名文件的状态
  • 模板:文件中要有自定义的模板内容

注意:记得将以下的C#脚本放在Assets/Editor目录下,否则会在打包时报错

方法一(推荐)

using UnityEngine;
using UnityEditor;
using System.IO;

public class CreateAndRenameLuaScript
{
    // 默认文件名
    private static readonly string FILE_NAME = "NewLuaScript.lua";
    // 脚本默认内容
    private static readonly string DEFAULT_CONTENT = "-- Lua脚本的默认内容\nprint(\"Hello, World!\")";

    [MenuItem("Assets/Create/Lua Script", false, 80)]
    public static void CreateNewLuaScript()
    {
        // 获取当前选中的对象的路径
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);

        if (path == "")
        {
            path = "Assets";
        }
        // 如果选中的对象不是文件夹,则在其所在目录下创建Lua脚本
        else if (!AssetDatabase.IsValidFolder(path))
        {
            path = Path.GetDirectoryName(path);
        }

        // 设置新Lua脚本的完整路径和名称
        path = Path.Combine(path, FILE_NAME);
        string newFilePath = AssetDatabase.GenerateUniqueAssetPath(path);

        // 创建Asset
        ProjectWindowUtil.CreateAssetWithContent(newFilePath, DEFAULT_CONTENT);
    }
}

首先,是文件路径。如果当前有选中某个文件夹,则在该文件夹下创建文件。若选中的是一个文件,则在其相同目录下创建。如果未选中任何文件,则默认创建在Assets目录下。

接下来为了防止出现文件重名的情况,这里使用了AssetDatabase.GenerateUniqueAssetPath方法。其功能就是当文件重名时,自动为其加上数字后缀,类似于新建文件新建文件1新建文件2这种效果。

最后,就需要创建文件。其实Unity给我们提供了一个非常方便的API,叫做ProjectWindowUtil.CreateAssetWithContent。使用该API创建文件后就会自动进入重命名状态,并且还能使用ESC取消创建,整个行为和创建C#脚本是完全相同的。

这个API的特殊之处,在于它不会限制文件的后缀名。像是ProjectWindowUtil.CreateAssetAssetDatabase.CreateAsset,虽然也能创建文件,但它们会输出不支持.lua后缀的错误消息。

方法二

这个方法是在我发现ProjectWindowUtil.CreateAssetWithContent这个API之前,所采用的一种“笨办法“,放在这里也主要用于展示另外一种思路。

using UnityEngine;
using UnityEditor;
using System.IO;

public class CreateAndRenameLuaScript
{
    // 默认文件名
    private static readonly string FILE_NAME = "NewLuaScript.lua";
    // 脚本默认内容
    private static readonly string DEFAULT_CONTENT = "-- Lua脚本的默认内容\nprint(\"Hello, World!\")";

    [MenuItem("Assets/Create/Lua Script", false, 80)]
    public static void CreateNewLuaScript()
    {
        // 获取当前选中的对象的路径
        string path = AssetDatabase.GetAssetPath(Selection.activeObject);

        if (path == "")
        {
            path = "Assets";
        }
        // 如果选中的对象不是文件夹,则在其所在目录下创建Lua脚本
        else if (!AssetDatabase.IsValidFolder(path))
        {
            path = Path.GetDirectoryName(path);
        }

        // 设置新Lua脚本的完整路径和名称
        path = Path.Combine(path, FILE_NAME);
        string newFilePath = AssetDatabase.GenerateUniqueAssetPath(path);

        /* ================以上与方法一相同=================== */


        // 创建新的Lua脚本文件
        File.WriteAllText(newFilePath, DEFAULT_CONTENT);
        // 导入到Unity资产数据库中,也可使用AssetDatabase.Refresh()
        AssetDatabase.ImportAsset(newFilePath);
        // 选中新创建的Lua脚本文件
        Selection.activeObject = AssetDatabase.LoadAssetAtPath<Object>(newFilePath);

        // 进入重命名状态
        // 创建文件之后需要经过**两次**延迟(delayCall),才能使用F2重命名
        // 否则会错误地变成重命名之前选择的文件
        EditorApplication.delayCall += () =>
        {
            EditorApplication.delayCall += () =>
            {
                // 模拟按下F2,进入重命名状态
                EditorWindow.focusedWindow.SendEvent(new Event { keyCode = KeyCode.F2, type = EventType.KeyDown });
            };
        };
    }
}

前面关于设置文件路径的部分与方法一相同,主要的区别在于之后的文件创建与重命名。

在方法二中,我们直接使用C#提供的File.WriteAllText创建文件,然后用AssetDatabase.ImportAsset将文件添加到Unity的资产数据库,让Unity能识别该文件。

主要问题在于,如何在文件创建后自动进入重命名状态。由于Unity并没有提供类似的API,所以我们只能进行按键模拟。

首先,使用Selection.activeObject选中刚才创建的文件。接下来,经过两次延迟(EditorApplication.delayCall)之后,发送模拟按下F2的事件,进入重命名状态。

需要注意的是,这里必须经过两次delayCall之后才能正确地选择重命名目标,否则进入重命名状态的就会是之前选中的文件。我猜测,是因为执行了AssetDatabase.ImportAssetSelection.activeObject两次操作,所以需要两次延迟之后才能正确地更新当前选中的目标。

这样做的缺点也是显而易见的。首先,相较于方法一,你能明显地看出经过两次延迟之后,创建文件和进入重命名状态之间大概会有零点几秒的间隔。并且,由于我们事先创建好了文件,所以是不能在重命名时按ESC取消创建的。因此,还是更加推荐使用方法一。

参考资料

How to implement "Create new asset"?

Unity 自定义脚本模板 添加头部注释


本文发布于2024年5月26日

最后编辑于2024年5月26日

posted @ 2024-05-26 14:01  千松  阅读(15)  评论(0编辑  收藏  举报