IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:嵌入式脚本

共 1 篇相关文章

IT 累计浏览 2,215

在 Unity3D 的 Mono 虚拟机中嵌入 Lua 的一个方案

这篇文章探讨了在 Unity3D 中嵌入 Lua 时,如何设计一个既简洁又完备的跨虚拟机交互方案。作者指出,市面上已有的许多方案存在过度繁琐或细节不完备的问题,他从 C/S 架构的通讯模型出发,提出了核心思路:将 Mono 与 Lua 间的交互抽象为一次“异地函数调用”。 这个方案的核心精巧之处在于,它不直接暴露 Lua 的 C API,而是通过一个中间层的 struct 来传递所有数据。调用函数和参数被编码进这个 struct,统一由一个 C 函数传递给 Lua 虚拟机。这种设计极大地提高了模块的内聚性,并严格控制了 Mono 和 Lua 两套异常机制的边界,防止异常泄漏。 文章还深入剖析了方案中最具挑战性的部分:两个虚拟机间的对象循环引用管理。作者详细讨论了如何利用 Lua 的弱表(weak table)和 ephemeron table 来检测仅被外部虚拟机引用的对象,并最终解除循环引用。同时,他也务实地建议,在多数项目中,保持清晰的单边引用关系(Lua 长期持有 C# 对象,C# 短期持有 Lua 对象)是更简单有效的做法。 基于这套理念,作者在周末实现了一个名为 sharplua 的轻量级方案。它提供了极简的 API:一个创建 Lua 虚拟机,两个核心的 CallFunction 和 GetFunction 用于双向调用,以及一个 CollectGarbage 用于管理跨语言对象的内存。整个实现代码开源,结构清晰,为希望自定义嵌入方案的开发者提供了一个干净的基础模板。