【Unity编辑器扩展实践】、基于模板创建Lua脚本

当前项目使用C#开发版本,IOS使用Xlua热更代码。每次创建Xlua文件的时候,都是复制之前的Lua文件修改文件名、类名,模板内容基本一致,觉得有一点麻烦。

以前写过一篇文章:修改Unity、VS2015创建C#脚本时使用的模板,就想仿照着Unity创建C#脚本时的方法写一个创建Lua脚本的编辑器扩展。

首先根据需求,创建一个Txt模板:100-Lua Script-NewLua.lua.txt

local #SCRIPTNAME#Class = DeclareClass("#SCRIPTNAME#Class")

function #SCRIPTNAME#Class:HotFix()
    xlua.private_accessible(CS.#SCRIPTNAME#)
    xluaUtil.hotfix_ex(CS.#SCRIPTNAME#, "XXXXX", self.XXXXX)
    LogE("hotfix #SCRIPTNAME#Class")
end

function #SCRIPTNAME#Class.XXXXX(this, args)
	this:XXXXX(args)
end

function #SCRIPTNAME#Class:Destory()
    xlua.hotfix(CS.#SCRIPTNAME#, "XXXXX", nil)
end

添加编辑器代码,调用ProjectWindowUtil.StartNameEditingIfProjectWindowExists函数创建文件时编辑文件名称。

 [MenuItem("Assets/Create/Xlua Script",false,101)]
    static void CreateXluaHotfixField()
    {
        string _path = "Assets/XLua/Editor/100-Lua Script-NewLua.lua.txt";//模板路径
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
             ScriptableObject.CreateInstance<CreateLuaScriptAsset>(),
             GetSelectedPath(),
             null,
             _path
             );
        AssetDatabase.Refresh();
    }

    private static string GetSelectedPath()
    {
        UnityEngine.Object[] obj = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.TopLevel);
        string path = AssetDatabase.GetAssetPath(obj[0]) + "/New Lua.txt";
        return path;
    }

创建CraetLuaScriptAsset类,继承EndNameEditAction 重写Action。


using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;

class CreateLuaScriptAsset : EndNameEditAction
{
    public override void Action(int instanceId, string pathName, string resourceFile)
    {
        UnityEngine.Object o = CreateScriptAssetFormTemplate(pathName, resourceFile);
        ProjectWindowUtil.ShowCreatedAsset(o);
    }

    internal static UnityEngine.Object CreateScriptAssetFormTemplate(string pathName, string resourcesFile)
    {
        string _fileName = Path.GetFileNameWithoutExtension(pathName);
        pathName = pathName.Replace(_fileName, _fileName + ".lua");
        string fullName = Path.GetFullPath(pathName);
        //读取模板
        StreamReader streamReader = new StreamReader(resourcesFile);
        string text = streamReader.ReadToEnd();
        streamReader.Close();

        //修改内容
        text = Regex.Replace(text, "#SCRIPTNAME#", _fileName);
       
        //写文件
        StreamWriter streamWriter = new StreamWriter(fullName);
        streamWriter.Write(text);
        streamWriter.Close();

        AssetDatabase.ImportAsset(pathName);
        return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
    }

}

在CreatScriptAssetFormTemplate函数中会读取模板内容,按需求修改内容,最后再写入对应路径。这样,就能像创建C#代码一样创建自定义的Lua代码了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值