跳到主要内容

设计概览

:::tip 谁该读本文 选型者、新接入开发者、需要理解「为什么这样设计」的读者。 日常 API 用法请直接看 使用指南;实现细节见 规范文档。 :::

ZLua 把 Lua 当作另一种 Native:类比 P/Invoke,用声明式 API 统一双向互操作;Il2Cpp 侧生成 C++ stubZLua/Generate/All),不是 xLua 式 C# Wrap。

P/Invoke 与 ZLua 对照

C# 互操作职责ZLua 对应
P/InvokeC# 调用 native 函数GetFunction<T> — C# 调用 Lua
MonoPInvokeCallbacknative 回调 C#[MonoLuaCallback] — 仅 int (IntPtr L) 原生回调
MarshalAs覆盖默认 Marshal[LuaMarshalAs] — C# ↔ Lua Marshal 覆盖

核心原则

原则说明
统一双向调用C#→Lua:GetFunction<T>;Lua→C#:CSharp 懒注册,语法贴近 C#
自动生成(Lua→C#)Editor Emit / Il2Cpp Generate C++ stub;C#→Lua 无 per-call codegen
深度集成LuaAppDomain.Initialize 一次完成 CLR + lua_State + zlua 库;热更清空走 Reset
C++ 直桥Player 字段 offset 直读、方法经 methodPointer,无海量 C# Wrap
零 Wrapper 膨胀相同签名共享桥接函数,而非每成员一个 Wrap

自动生成流水线(Lua→C#)

阶段Mono (Editor)Il2Cpp (Player)
C#→LuaGetFunction + Delegate 桥同左(native 路径)
Lua→C# 成员首次访问 EnsureBinding + EmitEnsureBinding + C++ stub(Generate)
开发者感知无 C# Wrap无 C# Wrap;须 Generate stub

与 xLua 的路径差异(摘要)

维度xLua 常见路径ZLua
类型暴露生成 C# Wrap / CodeEmitCSharp 根表 + 元表三表
C#→LuaLuaEnv.DoString / DelegateBridgeGetFunction<T> + Invoke
Player 性能Wrap + 多次 LuaDLLC++ 直桥 + 签名复用(见 PERFORMANCE

详见 选型对比Il2Cpp 实现

何时读哪份文档

你的问题推荐阅读
怎么从 C# 调 Lua?C# 调用 Lua 指南
Lua 怎么访问 C# 类型?Lua 调用 C#
参数怎么传递?Marshal 模型概览
Editor 与 Player 差别?双运行时
完整设计语义?设计规范

相关文档