前言:可以编写lua的工具有很多,比如subline,zerobrance studio, luastudio,decode,babelua,EmmyLua等,但是真的很方便调试lua的工具却很少。以前用的比较多的工具是luastudio,这是款收费软件,还不好破解,网上的各种破解版几乎运行几分钟就会自动闪退,所以有钱的朋友可以买一个用下。现在发现一款基于IntelliJ IDEA的EmmyLua插件。该插件功能非常完整,包括断点调试、自动提示、代码跳转、智能重命名等,可以极大地提高Lua编程的速度。界面也比较舒服。最主要的是免费的,吸引力比较强。所以写下本编文章记录下,也希望可以给看到本篇博客的朋友一点帮助。
特别提醒:由于我在写这篇博客时,最新的IntelliJ IDEA是2017系列,但是这个版本的软件存在一个致命的bug,那就是当目录下面的文件太多(我项目中是4500多个),idea建立index时就会报错,然后一直卡在那不动。必须排除一些文件才能index完毕,而排除的文件是不能断点的,这样就给调试lua造成一定的困扰和不方便。解决这个问题的方法就是降级到2017以下或者升级到2017以上。这里我选择的是安装IntelliJ IDEA2018.3.4版本,并且配合emmylua1.2.6-idea182版本的lua环境,完美解决文件太多时index卡死的问题。下面的软件安装指南流程都是一样的,只是换成对应版本就行,这里我就不改了。
安装IntelliJ IDEA:
1.下载地址为:https://confluence.jetbrains.com/display/IntelliJIDEA/Previous+IntelliJ+IDEA+Releases,这里选择的是2017.3.5 Ultimate版本。
2.启动安装程序,流程图如下所示:
破解IntelliJ IDEA:这里选择的是破解补丁激活方法,过程如下:
1.破解补丁下载地址为:https://pan.baidu.com/s/1KUFUflJleyHnHZAllnzXUQ 密码:3493。并将下载的破解补丁放在你的安装IDEA下面的bin的目录下面。
2.IDEA的bin目录下面有2个文件 : idea.exe.vmoptions和idea64.exe.vmoptions。用记事本打开,在上述两个文件的最后一行均加上-javaagent:IDEA安装目录\bin\破解补丁文件名.jar
3.获取激活码地址为http://idea.lanyus.com/,获取过程如图所示:
4.启动IDEA,第一次进入会提示激活,选择Activation Code,并输入如上3步骤中获取的激活码,流程如图所示
5.软件启动,进入Help,选择About,页面显示December 31,2099到期,完成激活。如下图:
汉化IntelliJ IDEA:这里选择的是补丁汉化方法,过程如下:
1.在主界面选择File → Settings → Appearance&Behavior → Appearance → 勾选Override default fonts by(not recommended)。其中Name选择任意一个中文字体,否则中文显示乱码,这里选择的是Microsoft YaHei。如图所示:
2.汉化补丁下载地址为:https://pan.baidu.com/s/1QUpLOgMrVtC0PSfwGjOd0g 密码:5d7t。并将下载的汉化补丁放在你的安装IDEA下面的lib目录下,重启IDEA即可完成汉化。
3.有时候汉化版的界面不能显示,此时如果想取消汉化版,只需将IDEA下面的lib目录中的汉化插件移除即可。如果想要有汉化版,只需将汉化插件放在你的安装IDEA下面的lib目录下即可。
安装lua for windows插件:lua for windows是lua环境开发的运行时文件,安装步骤如下:
1.下载VC++2005运行时库,下载地址为:https://pan.baidu.com/s/1QAPmJ1zhHDphqakcSWaiew 密码:j7s9。只需要安装里面的vc++2005运行时库就行了。
2.下载lua for windows插件,下载地址为:http://luaforge.net/projects/luaforwindows,我这里使用的是LuaForWindows_v5.1.4-35。一般安装完后自动设置环境变量的,没有设置就手动设置一下。比如我的安装目录是lua5.1,在环境变量的Path中加入D:\Progma\lua5.1;D:\Progma\lua5.1\clibs;
3.使用cmd验证是否安装成功,流程如下图所示:
安装EmmyLua插件:建议直接在IDEA工具内搜索插件安装(当然也可以下载插件到硬盘安装,插件地址为:https://plugins.jetbrains.com/plugin/9768-emmylua),这里选择的EmmyLua版本是1.2.2,安装完需要重启IDEA。流程如图所示:
配置EmmyLua事项:在使用EmmyLua调试lua前,需要做一些工程配置,常见配置如下:
1.关联指定文件:比如将*.txt识别成lua文件,如图所示
2.忽略指定文件:如图所示
3.代码提示忽略大小写:如图所示
创建Lua项目:创建流程如下:
1.New-Project,然后next,填项目名、路径,点击finish。
2.在项目视图的src文件夹New一个Lua文件。如:Test.lua。
3.配置SDK:配置方式如图所示
4.将模块已有源码目录设为Sources目录:菜单进入File -> Project Structure, 选择 Modules -> Sources -> Add Content Root -> 选择源码根目录-> Mark as: Sources。如图所示:
5.在Test.lua文件中加入一句print(“it works”)语句,然后点击Run就可以运行了。运行结果如图所示:
如果运行不成功,就需要检查SDK配置是否正确。
本地调试Lua项目:调试流程如下:
1.调试普通Lua项目时只需在对应地方打断点就行,然后点击Run->Debug Test.lua或者工具栏中的Debug图标就可以启动调试了。调试结果如图所示:
2.调试unity引擎Lua项目时只需在对应地方打断点就行,然后点击Run -> Attach to Local Process, 选择 Unity.exe,就可以启动调试了。调试流程如图所示:
远程调试Lua项目:调试流程如下:
1.配置Remote调试设置,如图所示:
2.点击 + 选择并创建 Lua Remote(Mobdebug) 配置,如图所示:
3.设置好相关参数后点击OK,如图所示:
4.点击右上角debug按钮并注意IDEA控制台LOG输出,如图所示:
5.远程调试通信依赖于luasocket模块,所以被调试的程序需要支持luasocket。这里以tolua插件开启luasocket进行介绍,slua以及ulua等插件开启luasocket方式请参照对应官网介绍。tolua插件中开启luasocket的方式如下:
一.将LuaClient中的openLuaSocket设置为true,如图所示:
二.LuaClient中自动将luasocket添加到lua虚拟机堆栈中,如图所示:
6.远程调试内核基于mobdebug.lua,所以被调试的程序需要支持mobdebug.lua。下载地址为:https://pan.baidu.com/s/1xbLSgM_MGjBzScsDOoVoLg 密码:laqn。此时将该文件放在入口文件同级目录下,要不然会报找不到mobdebug的错误。
7.在入口文件中加入require("mobdebug").start("localhost", 8172) --默认值为 "localhost", 8172 也可以设置自己想要的ip和port
8.unity启动场景中加入tolua插件的LuaClient.cs文件,运行unity目标程序时会自动打开刚才配置好的luasocket库并且执行入口文件中的入口方法,此时idea控制台出现Connect提示,表明远程连接成功,此时就可以断点调试了。如图所示:
调试失败相关问题排查:
1.远程调试运行目标出现“module ‘mobdebug’ not found:no field package.preload[‘mobdebug’]”日志时,此时要检查mobdebug.lua文件是否放入到模块源代码根目录Source中主入口文件(如Main.lua文件)相同层级下。
2.远程调试运行目标出现Connected 日志有,但断点无效时,此时要检查目标程序在运行时提供的文件名与源码文件的文件名一致(致少除了后缀名的前面的部分一致)以及是否将模块源码目录设为Sources目录。
3.本地调试出现断点无效,IDEA控制台窗口出现 xxx not found 日志时,此时要检查是否将模块源码目录设为Sources目录。
4.本地调试出现附加到目标程序失败,Error: LuaInject.dll could not be loaded into the process日志时,此时要检查是否被杀软、安全卫士拦截了注入过程。
5.本地调试出现lua.exe not found日志时,此时要检查SDK配置是否正确。
EmmyLua注解提示功能:emmylua中提供的注解功能可以让代码提示更加清晰。由于注解实际上是lua里面的注释,所以注解功能不会影响lua任何运行效率。具体注解使用参照地址:https://pan.baidu.com/s/1YdUJH8JNWB1zA9ZjD8L-Vg 密码:q5s1
tolua导出unity类提示功能:由于emmylua中包含了lua api的库,所以对lua api以及自己编写的lua类都可以进行代码提示,加上注解功能后,它们的代码提示就十分清晰。但是unity相关导出类的代码详细提示功能却没有,此时就需要我们做兼容支持。流程如下:
1.编写tolua中unity导出类的注解类ToLuaEmmyAPIGenerator.cs文件。文件地址为:https://pan.baidu.com/s/1-mdnPcwxmu02fm7H7iUPWw 密码:6po5。将下载好的ToLuaEmmyAPIGeneratorwen.cs文件放在unity的editor目录下。
2.打开unity,执行Lua->Gen API for EmmyLua,此时会生成unity导出类的注解类文件,而且默认生成目录为ProjectName/LuaAPI。将该目录打成zip包,这里命名为UnityLuaAPI.zip,这里提供生成好的UnityLuaAPI.zip文件,文件地址为:https://pan.baidu.com/s/18WUmiKbm8foiTPuMsD4fMA 密码:x7gf。
2.在IDEA的Module中导入下载好的UnityLuaAPI.zip库文件。导入流程如图所示:
3.编写测试文件,查看unity相关api是否可以智能代码提示。如图所示:
4.这里导出的unity api只是另外生成的一份lua版本并加入到idea的依赖库里面。主要是方便使用注解来给出unity api的提示。所以最终调用时还是使用tolua导出到lua虚拟机上面的相关接口实现。
unity控制台日志跳转功能:emmylua自身支持lua文件之间的相互跳转,但是在unity的控制台里面的lua日志就不能跳转。所以如果想在unity的控制台里跳转打印的日志,必须额外做兼容处理。相关流程如下:
1.编写unity控制台中日志跳转类ConsoleToLuaIDE.cs文件。地址为:https://pan.baidu.com/s/1d-HyQj6Eeebys0FbScj3jw 密码:qomw。将下载好的ConsoleToLuaIDE.cs文件放在unity的editor目录下。
2.设置好idea的启动路径和模块源代码根路径,如图所示:
3.点击unity控制台日志,查看是否进行跳转。如图所示:
IDEA中常用的快捷键:熟悉常用的快捷键对我们编写代码可以起到事半功倍的作用。这里列举常用的快捷键如下:
1.ctrl + f12:显示代码大纲。
2.ctrl + n:导航到类定义。
3.ctrl + shift + n:快速打开文件。
4.ctrl + shift + alt + n:导航到任意符号(全局变量,类以及类中的方法等)。
注意:
1.更对emmylua学习资料可以加入官方qq号29850775,里面有很多emmylua相关学习资料。也可以在emmylua的在线文档https://emmylua.github.io/或者视频:https://pan.baidu.com/s/12knNlnqDraw3r8zSXQMMfQ 密码:qxup,来学习更多具体用法。