跳到主要内容
版本:latest

HybridCLR+lua/js/python

有一些项目已经上线,它们的大多数代码已经用lua实现了;或者一些新项目已经用lua开发到一半,他们无法完全切换为全C#开发,但希望 可以同时接入HybridCLR,帮助慢慢过渡到全部原生C#热更新。由于HybridCLR是原生C#热更新技术,原生支持与这些脚本语言配合工作。

使用 ZLua/ZenTS

强烈推荐

ZLuaZenTS是 我们官方实现的Unity引擎下的lua和javascript/typescript方案。它们直接与il2cpp交互,不需要像其他第三方案一样需要生成和配置复杂的[MonoPInvokeCallback]

ZLua和ZenTS是现代的Unity脚本方案,零配置,高性能,GC极低,无wrapper,与C#交互完备。使用hybridclr的开发者可以零成本获得脚本能力。

其他第三方脚本方案

相比于ZLua/ZenTS,这些脚本方案能工作,但配置麻烦,并且需要对原始方案进行一定程度源码改造。无论是集成难度、运行性能、GC、开发效率,都与ZLua/ZenTS有很大的差距。只推荐有比较强技术能力的项目使用。

原理

所有第三方脚本(lua、typescript、python等)与C#代码交互都依赖于用[MonoPInvokeCallback]标记要从native回调的C#函数。 il2cpp会为每个标记了[MonoPInvokeCallback]的函数绑定一个单独的Wrapper函数,处理managed与native之间传参与返回值marshal之类的问题。

同样的,hybridclr也需要为每个标记了[MonoPInvokeCallback]的函数生成对应的Wrapper函数。但对于iOS这类禁用了jit的平台,显然没法运行时 动态生成这些wrapper函数。因此需要提前为将来可能用到的这类函数预留相应的Wrapper函数。

如何预留Wrapper函数,详见文档MonoPInvokeCallback支持

xlua

xlua并未考虑过模块化,生成的代码全在全局Assembly-CSharp里,甚至做成partial类与Runtime代码关联,因此你可能需要对这些热更新方案的生成代码做少量调整,才能与热更新配合工作。 已经有群友制作了 HybridCLR+xlua 的项目 HybridCLRXlua,已经跑通。没有充分理解的开发者可以借鉴学习。

tolua、slua、puerts

确保预留了足够多的ReversePInvokeWrapper函数并且生成的wrapper代码能放到热更新模块,并且正确注册即可。