常见问题
按主题分类;未覆盖见 排错指南 或 GitHub Issues。
一般
ZLua 与 xLua 有什么区别?
ZLua 在 Il2Cpp 内嵌 Lua、C++ 直桥,不生成 per-type C# Wrap(Player 生成 C++ stub)。类型访问用 CSharp 根表,C# 调 Lua 用 LuaAppDomain.GetFunction<T>。见 为什么选择 ZLua、选型对比、从 xLua 迁移。
Mono 和 Il2Cpp 差别有多大?
Lua 可见语义一致。Mono(Editor)与 Il2Cpp(Player)均已完成;实现路径不同(Emit vs C++ stub)。见 项目状态。
当前适合上生产吗?
Il2Cpp Player 可用于完整语义验证与发布;接受 libil2cpp 集成 与 ZLua/Generate/All。Hotfix 等 xLua 专长需自建。见 兼容性。
支持哪些 Unity / Lua 版本?
见 兼容性。PUC-Rio 5.1–5.5 已支持;LuaJIT 已支持,但 Il2Cpp Player 仅 Android / iOS(细则见 LuaJIT 构建)。
安装与工程
如何安装 ZLua?
UPM:"com.code-philosophy.zlua": "https://github.com/focus-creative-games/zlua.git"。见 安装、zlua-demo。
发布前要 Generate 吗?
Il2Cpp:要。 菜单 ZLua/Generate/All 生成 C++ MethodBridge 等 Lua→C# stub,不是 xLua 式 C# Wrap。Editor Mono 不依赖该 C# Wrap 流程。C#→Lua 无 Generate 步骤。
Lua 脚本放哪里?
项目根 LuaScripts/*.lua(Editor);Player Sync 到 StreamingAssets/LuaScripts/*.lua.txt。
类型与语法
含 namespace 的类型怎么访问?
CSharp.AC['MyGame.UI.Panel'],不能链式点号穿越 namespace。
Event 怎么订阅?
无 .get / .set 专用表。使用 obj:add_OnX(handler) / obj:remove_OnX(handler)。见 Event。
ref / out 怎么用?
Lua→C#:ByVal userdata 或 Opaque 可写回;裸 number 不回写。C#→Lua byref 默认 Opaque。见 ref/out/in、BYREF。
互操作
如何从 C# 调用 Lua?
LuaAppDomain.GetFunction<T>("module","method") 取得 Delegate 后 Invoke。见 C# 调用 Lua。
方法重载怎么选?
默认 demo:Run(10) 走 dispatch;精确点名用全签名键 demo['Run(System.Int32)'](demo, 10);热路径短名用 [LuaAlias] 或 register_method 后再 demo:run_i32(10)。见 方法重载。
Lua 如何传回调给 C#?
直接传 function。见 Function 与 Delegate。
Player / 发布
Editor 正常 Player 失败?
检查:是否 Generate;Lua 是否 Sync;是否使用已废弃 Event API。见 Editor vs Player、排错。
Player 性能如何?
以 Il2Cpp 为准。公开四方基准:zlua-benchmark;摘要见 PERFORMANCE;最新完整报告:comparison_20260728_121554.md。