Unity lua脚本调试

本文介绍如何使用JetBrains的PyCharm和Visual Studio Code的LuaPanda插件调试Unity中的Lua脚本,涵盖自动补全、代码片段、定义跳转、类型推断等功能,以及调试配置流程。

原生的lua代码调试支持的工具很多, 这里主要说的是能Attach到Unity进程交互调试的工具。 大多游戏都在使用lua脚本来热更新游戏逻辑,下面介绍两个工具如何调试lua,

  • jetbrains旗下软件(IntelliJ IDEA 和 Pycharm)
  • vscode(LuaPanda)



两款ide都是跨平台的, 在windows和macos上都有很好的支持, 而且都支持以下lua的特性:

  • 自动补全(auto completion)
  • 代码片段(snippet completion)
  • 定义跳转(definition)
  • 生成注释(comment generation)
  • 类型推断(limited type inference)
  • 代码格式化(formatting): vscode依赖 lua-fmt
  • 代码诊断(linting):vscode依赖 luacheck
  • 调试器(debugger)

Jet brains 工具链

下载安装IntelliJ IDEA 或者pycharm, 这两款软件都是Jet Brains旗下的软件。 现在更多的人使用它们来开发python或者java, 我们这里主要使用的是其一款插件,叫做EmmyLua。

以Pycharm为例:

安装好之后,选择File->Settings, 再打开的设置窗口选中Plugins来安装插件, 搜到EmmyLua, 点击Install按钮,进行安装:

在这里插入图片描述

选择Unity工程lua脚本所在的文件夹打开(注意lua require时搜索路径,所以这里一定对应起来)。

增加识别文件扩展名,将*.lua 和*.txt统统识别为lua脚本,(*.lua.txt能识别为lua,但影响debug, 可能是emmylua的一个bug)

在这里插入图片描述

在上图选项Ignore files and folders 可以设置忽略在侧边栏显示的文件匹配符。很多非代码相关的东西都可以通过此方式屏蔽掉。

菜单栏选中Run->Attach to Process, 在本机所有的进程中选择Unity进程即可调试了。

在这里插入图片描述

运行效果如下, 既可以看到调用堆栈, 又可以查看过程变量,非常的方便。

在这里插入图片描述

如果你不习惯pycharm自带的快捷键, 你还可以在setting的Keymap中改成vs的快捷键。除了vs的快捷键, pycharm还提供了很多其他编辑器的快捷键, 比如说Sublime, Eclipse等。

如果你之前是一名python开发者, 第一次打开一个lua的工程的时候, pycharm会加载很多python本地安装的packages, 如果这影响了编辑器的性能,你可以在Settings里面清掉Project interpreter:

在这里插入图片描述

如果你是一位原生的lua开发者, 而非使用引擎调试lua, 你需要配置编译好的lua.exe的文件位置和lua的search path, 配置好之后也能很方便的调试。

在这里插入图片描述

VSCode

这里推荐一款vscode的plugin, 腾讯开发的插件叫LuaPanda, 因为LuaPanda是基于luasocket的, 所以你必须确保你的lua环境已经安装了luasocket, 又鉴于此特性,所以这款插件还可以远程调试, 比如说手机连着编辑器调试。

在这里插入图片描述

LuaPanda的vscode adapter是使用typescript(javascript的超集) 语言编写的, 大约1000行,核心代码: luaDebug.ts

文件配置

文件:LuaPanda.lua

下载位置:github 的 Debugger 目录下

把以上两个文件放在lua代码可以引用到的位置,并在用户代码中引用:

require(“LuaPanda”).start(“127.0.0.1”,8818);
*8818是默认端口号,如果需要修改,请同时修改launch.json的端口设置。

调试配置

切换到VSCode的调试选项卡,点击齿轮,在弹出框中选择 LuaPanda (若无此选项说明以前用别的插件调试过lua , 要把先前用过的调试插件禁用)。会自动生成launch.json文件。

launch.json 配置项中要修改的主要是luaFileExtension, 改成lua文件使用的后缀就行。(比如xlua改为lua.txt, slua是txt)。各配置项鼠标悬停会有提示,可根据需要更改。

在这里插入图片描述

先运行VSCode端,再运行Lua代码: 点击调试选项卡左上角的绿色箭头,再运行unity/ue4工程。如果有stopOnEntry或是执行到断点处,就会自动停住。

在这里插入图片描述

LuaPanda 在PC上调试会默认使用 c hook,它是用c重写了debugger的核心hook部分,从而提高调试器的执行效率。 c hook会默认启用,无需单独接入。

验证方式:停在断点处后,在调试控制台输入LuaPanda.getInfo(), 返回信息的BaseInfo会给出提示,如果c库已加载,还会给出版本号。

LuaPanda调试器功能依赖LuaSocket, 可运行于slua,slua-unreal ,xlua 等已集成 LuaSocket 的 lua 环境,也可以在console中调试。lua 版本支持 5.1- 5.3。

其他依赖项目(插件中已包含,无需用户手动安装):

luaparse
luacheck
lua-fmt
path-reader

更多关于LuaPanda的介绍, 参考这里

写在最后

由于作者经常使用pycharm写python脚本, 已经很熟悉Jetbrains的那一套环境了,所以我更倾向于使用第一种方式来调试lua。 然而vscode显然更轻量级一些, 读者喜欢使用哪一款,萝卜青菜 各有所爱吧。


<think>好的,我现在需要回答用户关于在Unity中使用Lua解析JSON的问题。首先,我得回忆一下相关的知识。用户提到了他们看到的引用内容,里面涉及Lua调试工具、C#对象与Lua的交互,以及AssetBundle的使用,但这些引用中并没有直接提到JSON解析。不过,结合UnityLua的常见做法,Lua通常通过第三方库来处理JSON数据。 首先,我需要确定Lua本身是否支持JSON解析。Lua的标准库没有内置JSON功能,所以必须使用第三方库。常见的库有cjson、dkjson或者Lua的纯Lua实现的JSON解析器。在Unity中,由于Lua通常是通过xlua、tolua这样的插件集成,可能需要将JSON库包含到项目里。 接下来,我需要考虑如何在Unity项目中引入这些库。用户可能已经使用了xlua或者tolua,所以需要指导他们如何将JSON库添加到Lua环境中。例如,下载dkjson.lua文件,放到项目的Resources目录下,或者通过require加载。 然后,编写示例代码是关键。用户需要具体的例子,比如如何解析一个JSON字符串,访问其中的数据。需要展示从字符串解析成Lua表,以及将Lua表编码成JSON字符串的过程。同时,要注意不同库之间的语法差异,比如cjson和dkjson的使用方法可能不同,需要说明。 另外,需要提到可能遇到的问题,比如性能问题,或者特殊数据类型的处理(如null、布尔值等),不同的库可能有不同的处理方式,这时候可能需要调整库的代码或配置。 还要考虑Unity的特定环境,比如在热更新中使用JSON解析,可能需要将JSON库打包到AssetBundle中,或者通过资源加载的方式引入。引用中的AssetBundle加载方法可能与此相关,但用户的问题主要集中在解析,所以可能不需要深入讨论AssetBundle,但可以稍微提及。 最后,确保示例代码的正确性,检查语法,比如是否正确使用冒号和点号调用方法,是否正确处理嵌套表结构。同时,提醒用户注意文件路径和库的兼容性,比如某些库可能需要稍作修改才能在UnityLua环境中运行。 总结步骤:介绍常用库,指导如何引入,提供解析和序列化的示例,注意事项,以及相关问题的建议。</think>### Unity中使用Lua解析JSON的方法 在Unity中通过Lua解析JSON数据,通常需要借助第三方Lua JSON库。以下是具体实现步骤和示例: --- #### 一、常用Lua JSON库选择 1. **dkjson** 纯Lua实现的轻量级库,兼容性较好,支持UTF-8编码[^2]。 2. **cjson** 基于C语言的高性能库,需编译成Lua模块(需注意Unity平台兼容性)。 --- #### 二、集成JSON库到Unity项目 1. **下载库文件** 将库文件(如`dkjson.lua`)放入`Assets/Resources`或热更新目录。 2. **加载库到Lua环境** ```lua local dkjson = require("dkjson") -- 或通过xlua的CustomLoader动态加载 ``` --- #### 三、解析JSON数据示例 ```lua -- JSON字符串示例 local jsonStr = [[ { "name": "Player", "hp": 100, "skills": ["Attack", "Defend"], "position": {"x": 1.2, "y": 3.4} } ]] -- 解析JSON为Lua表 local success, data = pcall(dkjson.decode, jsonStr) if success then print("角色名称:", data.name) -- 输出: Player print("技能数量:", #data.skills) -- 输出: 2 print("X坐标:", data.position.x) -- 输出: 1.2 else print("解析失败:", data) end ``` --- #### 四、生成JSON字符串示例 ```lua local playerData = { name = "Enemy", level = 5, isBoss = true, stats = { atk=50, def=30 } } local jsonOutput = dkjson.encode(playerData, { indent = true }) print(jsonOutput) -- 输出格式化后的JSON: -- { -- "isBoss": true, -- "level": 5, -- "name": "Enemy", -- "stats": { -- "atk": 50, -- "def": 30 -- } -- } ``` --- #### 五、注意事项 1. **数据类型映射** - Lua的`nil`对应JSON的`null` - 使用`dkjson.encode(value, { null = "nil" })`可自定义null处理 2. **性能优化** 频繁解析建议使用cjson(需编译为对应平台的插件)[^1] 3. **热更新集成** 可将JSON库打包到AssetBundle实现热更新加载[^3] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值