编辑
2024-09-12
编程语言
00

目录

本质
过程
二、Lua 调用 C#
本质
过程
三、交互机制对比
四、面试回答思路
delegate 映射到 Lua function,参数和返回值交给 ObjectTranslator 做类型转换。
类型,方法执行完结果再压回 Lua 栈。

一、C# 调用 Lua

本质

  • 传参数 → 调用 Lua 函数 → 取结果

过程

  1. 拿到 Lua 函数

    • 通过 [CSharpCallLua] 标记 delegate 类型。
    • Lua function 可以赋值给 C# 的 delegate,xLua 会生成 DelegateBridge 保存 Lua function 的引用。
  2. 调用链

    • C# 调用 delegate → 跳转到 DelegateBridge → 执行 __Gen_Delegate_Imp* 模板方法。
    • 模板方法负责:
      • 参数压栈
      • 执行 Lua 函数
      • 从栈取返回值并转换成 C# 类型
  3. 关键组件

    • DelegateBridge:桥接委托和 Lua function。
    • ObjectTranslator:完成参数和返回值的类型适配。

二、Lua 调用 C#

本质

  • 传参数 → 调用 C# 方法 → 返回值压回栈

过程

  1. 注册 C# 方法

    • 通过 [LuaCallCSharp] 标记类型,xLua 将方法暴露给 Lua VM。
    • Lua 脚本中可直接调用:CS.Type.Method()
  2. 调用链

    • Lua 调用 CS.UnityEngine.Debug.Log("Hello")
    • Lua VM 找到注册的 C# 方法入口
    • ObjectTranslator"Hello" 转成 C# string
    • 执行 Debug.Log()
    • 如果方法有返回值,压回 Lua 栈
  3. 关键组件

    • ObjectTranslator:参数/返回值转换
    • LuaCallCSharp:方法注册到 Lua

三、交互机制对比

lua_csharp_interop_flow.png

场景本质流程桥接/适配组件
C# 调 Lua参数压栈 → 调 Lua 函数 → 返回值取出DelegateBridge + ObjectTranslator
Lua 调 C#Lua 参数出栈 → 调 C# 方法 → 返回值压回ObjectTranslator + LuaCallCSharp

四、面试回答思路

  • 简答版

Lua 和 C# 的交互,本质上就是通过 Lua 栈传递参数和结果。

  • C# 调 Lua:传参数过去,拿结果回来;
  • Lua 调 C#:把参数传给 C# 方法,结果再压回 Lua 栈。
  • 深入版

C# 调 Lua 时,会通过 DelegateBridge 作为桥接类,把 C# delegate 映射到 Lua function,参数和返回值交给 ObjectTranslator 做类型转换。
Lua 调 C# 时,依赖 LuaCallCSharp 注册机制,Lua VM 调用时 ObjectTranslator 会把 Lua 栈参数转成 C# 类型,方法执行完结果再压回 Lua 栈。
所以本质就是 栈传递 + 类型翻译 + 桥接调用


本文作者:xuxuxuJS

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!