跳到主要内容

LuaAppDomain

LuaAppDomain 是 ZLua 的 唯一公开初始化入口。应用启动时调用一次,完成 Lua 状态创建、zlua 标准库加载、CSharp 根表注册,并按 Editor / Player 转发到对应后端。

Canonical 示例:zlua-demo Bootstrap.cs

API

namespace ZLua
{
public class LuaAppDomain
{
public static void Initialize(Func<string, object> moduleLoader);
}
}

Initialize(moduleLoader)

参数说明
moduleLoaderFunc<string, object>,按模块名返回 Lua 源码 stringbyte[]

典型挂载点:

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void InitZLuaOnStartup()
{
LuaAppDomain.Initialize(LoadLuaModule);
}

LoadLuaModule 负责 Editor(LuaScripts/*.lua)与 Player(StreamingAssets/*.lua.txt)路径差异,见 安装指南

初始化流程

双运行时转发

LuaAppDomain 本身在 ZLua.Common;实际逻辑由后端程序集实现:

环境程序集实现类型
Unity EditorZLua.MonoLuaMonoAppDomain
Il2Cpp PlayerZLua.Il2CppLuaIl2CppAppDomain

Application.isEditor 决定加载哪个后端;对外 API 不变

生命周期与 FramePump

初始化后会注册 LuaFramePump,在 Unity 帧循环中处理:

  • ref / userdata 延迟释放(ProcessPendingRefReleases
  • 与 Lua GC 协同的 pending 清理

一般 无需 手动调用;高级调试时可关注 Editor 日志中的 ZLua 初始化信息。

LuaEnv 的关系

类型可见性说明
LuaAppDomainpublic游戏代码唯一入口
LuaEnvpublic(Mono 模块)底层 lua_State 包装;由后端内部创建,不建议业务代码自行 new LuaEnv()

标准集成路径:LuaAppDomain.Initialize[LuaInvoke] / CSharp 访问。

模块加载约定

moduleLoader("app") 的返回值会被 require 语义加载。与 [LuaInvoke("app", "main")]module 参数必须一致。

Demo 约定:

环境路径
Editor{ProjectRoot}/LuaScripts/app.lua
PlayerStreamingAssets/LuaScripts/app.lua.txt

常见错误

现象处理
Lua module loader is not configured未调用 Initialize 或 loader 为 null
require 失败检查模块名、文件路径、.lua.txt 后缀
Player 无 Lua 脚本确认 Sync 脚本已执行,StreamingAssets 含目标文件

相关文档