LuaInterface 技术说明文档

1. 类概述

LuaInterface 是一个静态类,作为 Unity 客户端中 C# 与 Lua 之间的桥梁,提供了丰富的接口供 Lua 脚本调用 C# 功能。该类使用 [LuaCallCSharp] 注解标记可被 Lua 调用的成员,实现了 C# 与 Lua 之间的双向通信、事件处理、UI 操作、游戏状态管理等功能。

2. 命名空间

Global

3. 类成员列表

成员类型 成员名称 说明
方法 AddLuaCallback 向指定系统事件添加 Lua 回调
方法 RemoveLuaCallback 从指定系统事件移除 Lua 回调
方法 GetUserPanel 获取用户面板数据
方法 GetUserInfo 获取用户信息
方法 CallBackendLua 调用后端 Lua 函数
方法 SetGlobal 设置全局变量
方法 GetGlobal 获取全局变量
方法 OpenWindow 打开窗口
方法 LoadXML 加载 XML 文件为 VisualElement
方法 LoadXMLString 解析 XML 字符串为 VisualElement
方法 LoadMainUI 加载主 UI
方法 RemoveDialog 移除对话框
方法 NewMapRule 添加新的映射规则
方法 Restart 重新开始游戏
方法 AutoPilotTo 自动导航到指定坐标

4. 详细成员说明

4.1 AddLuaCallback

[LuaCallCSharp]
public static Guid AddLuaCallback(LuaFunction lua, SysEvent evt, object arg)

功能描述

向指定的系统事件添加一个 Lua 回调函数,当该事件触发时,将调用注册的 Lua 函数。

参数类型及说明

参数名 类型 说明
lua LuaFunction Lua 回调函数,签名应为 function(eventArg, arg)
evt SysEvent 系统事件类型,指定要监听的事件
arg object 传递给回调函数的额外参数

返回值类型及说明

类型 说明
Guid 回调函数的唯一标识符,用于后续移除该回调

使用示例

-- 监听背包变化事件
local callbackId = LuaInterface.AddLuaCallback(function(eventArg, arg)
    -- eventArg 包含背包变化的物品和变化类型
    -- arg 是注册时传递的额外参数
    print("背包发生变化", arg)
end, SysEvent.InventoryChangeEvent, "背包监听器")

注意事项

  • 必须保存返回的 Guid,以便在不需要监听时使用 RemoveLuaCallback 移除回调,避免内存泄漏
  • 回调函数的参数顺序固定:第一个参数是事件数据,第二个参数是注册时传递的额外参数

4.2 RemoveLuaCallback

[LuaCallCSharp]
public static void RemoveLuaCallback(SysEvent evt, Guid id)

功能描述

从指定的系统事件中移除一个已注册的 Lua 回调函数。

参数类型及说明

参数名 类型 说明
evt SysEvent 系统事件类型,指定要移除回调的事件
id Guid 要移除的回调函数的唯一标识符,由 AddLuaCallback 返回

使用示例

-- 移除之前注册的背包变化事件回调
LuaInterface.RemoveLuaCallback(SysEvent.InventoryChangeEvent, callbackId)

注意事项

  • 如果指定的 id 不存在于事件的回调列表中,该方法不会产生任何效果
  • 调用此方法后,回调函数将不再被触发

4.3 GetUserPanel

[LuaCallCSharp]
public static double GetUserPanel(int panelID)

功能描述

获取用户面板数据,返回指定面板 ID 对应的数值。

参数类型及说明

参数名 类型 说明
panelID int 面板 ID,指定要获取的面板数据类型

返回值类型及说明

类型 说明
double 指定面板 ID 对应的数值

使用示例

-- 获取用户生命值
local health = LuaInterface.GetUserPanel(1)  -- 假设 1 是生命值面板 ID
print("当前生命值:", health)

注意事项

  • 面板 ID 的具体含义由游戏逻辑定义,需要参考相关文档
  • 确保传入有效的面板 ID,否则可能返回错误值

4.4 GetUserInfo

[LuaCallCSharp]
public static string GetUserInfo(int infoID)

功能描述

获取用户信息,返回指定信息 ID 对应的字符串值。

参数类型及说明

参数名 类型 说明
infoID int 信息 ID,指定要获取的用户信息类型

返回值类型及说明

类型 说明
string 指定信息 ID 对应的用户信息字符串

使用示例

-- 获取用户名称
local userName = LuaInterface.GetUserInfo(0)  -- 假设 0 是用户名信息 ID
print("用户名:", userName)

注意事项

  • 信息 ID 的具体含义由游戏逻辑定义,需要参考相关文档
  • 确保传入有效的信息 ID,否则可能返回错误值

4.5 CallBackendLua

[LuaCallCSharp]
public static void CallBackendLua(string fileName, string functionName, string[] args)

功能描述

调用后端 Lua 函数,将请求发送到服务器执行指定的 Lua 函数。

参数类型及说明

参数名 类型 说明
fileName string 后端 Lua 文件名称
functionName string 要调用的函数名称
args string[] 传递给后端函数的参数数组,可为 null

使用示例

-- 调用后端 Lua 函数
local args = {"param1", "param2"}
LuaInterface.CallBackendLua("gameLogic.lua", "processGameEvent", args)

注意事项

  • 后端必须存在指定的 Lua 文件和函数
  • 参数数组中的元素必须都是字符串类型
  • 该方法是异步调用,不会立即返回结果

4.6 SetGlobal

[LuaCallCSharp]
public static void SetGlobal(string key, Object value)

功能描述

设置全局变量,将指定的键值对存储在全局字典中,供后续使用。

参数类型及说明

参数名 类型 说明
key string 全局变量的键名
value Object 全局变量的值,必须是 Unity 的 Object 类型或其子类

使用示例

-- 设置全局变量
local myElement = someVisualElement
LuaInterface.SetGlobal("MyGlobalElement", myElement)

注意事项

  • 只有 Unity 的 Object 类型或其子类可以存储为全局变量
  • 重复设置相同的键会覆盖之前的值

4.7 GetGlobal

[LuaCallCSharp]
public static Object GetGlobal(string key)

功能描述

获取全局变量,根据指定的键名从全局字典中获取对应的值。

参数类型及说明

参数名 类型 说明
key string 全局变量的键名

返回值类型及说明

类型 说明
Object 全局变量的值,如果键不存在可能返回 null

使用示例

-- 获取全局变量
local myElement = LuaInterface.GetGlobal("MyGlobalElement")
if myElement then
    -- 使用获取到的元素
    myElement.visible = true
end

异常处理

  • 如果指定的键不存在,可能会抛出异常,建议在使用前进行空值检查

注意事项

  • 返回的值需要根据实际类型进行转换后使用

4.8 OpenWindow

[LuaCallCSharp]
public static void OpenWindow(string filePath, string windowName = "DefaultWindow")

功能描述

打开一个新窗口,从指定的文件路径加载 UI 元素并显示。

参数类型及说明

参数名 类型 说明
filePath string UI XML 文件的路径
windowName string 窗口名称,用于标识和后续操作该窗口,默认为 “DefaultWindow”

使用示例

-- 打开一个新窗口
LuaInterface.OpenWindow("UI/Windows/MyWindow.uxml", "MyCustomWindow")

注意事项

  • 如果指定名称的窗口已存在,将先移除旧窗口再创建新窗口
  • 窗口会被自动添加到全局变量中,可通过 GetGlobal(windowName) 获取

4.9 LoadXML

[LuaCallCSharp]
public static VisualElement LoadXML(string filePath)

功能描述

从指定的文件路径加载 XML 文件,并解析为 VisualElement 对象。

参数类型及说明

参数名 类型 说明
filePath string UI XML 文件的路径

返回值类型及说明

类型 说明
VisualElement 解析后的 VisualElement 对象

使用示例

-- 加载 XML 文件
local element = LuaInterface.LoadXML("UI/Components/MyComponent.uxml")
-- 将元素添加到某个父容器中
parentElement:Add(element)

注意事项

  • 确保指定的文件路径正确,否则可能返回 null
  • 解析后的 VisualElement 需要手动添加到 UI 层级中才能显示

4.10 LoadXMLString

[LuaCallCSharp]
public static VisualElement LoadXMLString(string xmlString)

功能描述

将 XML 字符串解析为 VisualElement 对象。

参数类型及说明

参数名 类型 说明
xmlString string 包含 UI 定义的 XML 字符串

返回值类型及说明

类型 说明
VisualElement 解析后的 VisualElement 对象

使用示例

-- 解析 XML 字符串
local xmlString = [[
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements">
    <ui:Label text="Hello World" />
</ui:UXML>]]
local element = LuaInterface.LoadXMLString(xmlString)

注意事项

  • 确保 XML 字符串格式正确,否则可能返回 null 或抛出异常
  • 解析后的 VisualElement 需要手动添加到 UI 层级中才能显示

4.11 LoadMainUI

[LuaCallCSharp]
public static VisualElement LoadMainUI(string filePath)

功能描述

加载主 UI,从指定的文件路径加载 UI 元素并设置为游戏的主 UI。

参数类型及说明

参数名 类型 说明
filePath string 主 UI XML 文件的路径

返回值类型及说明

类型 说明
VisualElement 加载的主 UI VisualElement 对象

使用示例

-- 加载主 UI
local mainUI = LuaInterface.LoadMainUI("UI/MainUI.uxml")

注意事项

  • 此方法会替换当前的主 UI
  • 加载的主 UI 会自动显示在游戏中

4.12 RemoveDialog

[LuaCallCSharp]
public static void RemoveDialog(VisualElement dialog)

功能描述

移除指定的对话框,将其从 UI 层级中移除。

参数类型及说明

参数名 类型 说明
dialog VisualElement 要移除的对话框元素

使用示例

-- 移除对话框
local dialog = LuaInterface.GetGlobal("MyDialog")
if dialog then
    LuaInterface.RemoveDialog(dialog)
end

注意事项

  • 确保传入的对话框元素确实存在于 UI 层级中
  • 移除后,对话框将不再显示

4.13 NewMapRule

[LuaCallCSharp]
public static void NewMapRule(string key, string value)

功能描述

添加新的映射规则,将指定的键值对添加到资源管理器的映射规则中。

参数类型及说明

参数名 类型 说明
key string 映射规则的键名
value string 映射规则的值

使用示例

-- 添加新的映射规则
LuaInterface.NewMapRule("Map1001", "rule1,rule2,rule3")

注意事项

  • 映射规则的具体格式和用途由游戏逻辑定义
  • 重复添加相同的键可能会覆盖之前的值

4.14 Restart

[LuaCallCSharp]
public static void Restart()

功能描述

重新开始游戏,注销当前用户并重新登录。

使用示例

-- 重新开始游戏
LuaInterface.Restart()

注意事项

  • 此方法会中断当前游戏会话
  • 会触发一系列网络请求,包括注销和重新登录

4.15 AutoPilotTo

[LuaCallCSharp]
public static void AutoPilotTo(int x, int y, LuaFunction onCancel, LuaFunction onComplete)

功能描述

自动导航到指定的坐标位置。

参数类型及说明

参数名 类型 说明
x int 目标位置的 X 坐标
y int 目标位置的 Y 坐标
onCancel LuaFunction 导航取消时的回调函数,可选
onComplete LuaFunction 导航完成时的回调函数,可选

使用示例

-- 自动导航到指定坐标
LuaInterface.AutoPilotTo(100, 200, 
    function() print("导航已取消") end, 
    function() print("导航已完成") end)

注意事项

  • 确保指定的坐标在当前地图范围内
  • 导航过程中可能会被各种因素中断
  • 回调函数是可选的,可以传入 nil

5. 系统事件类型(SysEvent)

LuaInterface 中使用的 SysEvent 枚举定义了以下系统事件:

事件名称 说明
HideItemsChangeEvent 0 隐藏装备变化事件
InventoryChangeEvent 1 背包物品变化事件
ItemDuraChangeEvent 2 背包物品耐久度变化事件
ItemPropChangeEvent 3 背包物品属性变化事件
EquipChangeEvent 4 装备变化事件
EquipDuraChangeEvent 5 装备耐久度变化事件
EquipPropChangeEvent 6 装备属性变化事件
StatChangeEvent 7 角色属性变化事件
UserInfoChangeEvent 8 用户信息变化事件

6. 事件类型(EventType)

LuaInterface 中使用的 EventType 枚举定义了以下事件类型:

事件类型 说明
Modify 1 修改事件
Add 2 添加事件
Remove 3 移除事件

7. 最佳实践

  1. 回调管理:始终保存 AddLuaCallback 返回的 Guid,并在适当的时候调用 RemoveLuaCallback 移除回调,避免内存泄漏。

  2. 全局变量使用:谨慎使用全局变量,避免命名冲突,建议使用唯一的命名前缀。

  3. UI 操作:在操作 UI 元素时,确保元素存在且已正确加载。

  4. 错误处理:在调用可能抛出异常的方法时,使用 try-catch 块进行错误处理。

  5. 性能考虑:避免频繁调用耗时的方法,如 LoadXMLLoadXMLString

  6. 异步调用:注意 CallBackendLua 等异步方法的使用,不要期望立即返回结果。

8. 版本历史

版本 日期 变更说明
1.0 2025-12-03 初始版本

9. 联系方式

如有任何问题或建议,请联系开发团队。

作者:yilin01  创建时间:2025-12-04 10:25
最后编辑:yilin01  更新时间:2025-12-08 16:49