Unity3D 预备知识:C#与Lua相互调用
在使用Unity开发游戏以支持热更新的方案中,使用ULua是比较成熟的一种方案。那么,在使用ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了?
一.基本原理
简单地说,c#调用lua, 是c# 通过Pinvoke方式调用了lua的dll(一个C库),然后这个dll执行了lua脚本。
ULua = Lua + LuaJit(解析器、解释器) +LuaInterface。
其中,LuaInterface中的核心就是C#通过Pinvoke对Lua C库调用的封装,所以,在Unity中,LuaInterface就是C#与Lua进行交互的接口。
下面我们以一个简单的例子来演示C#与Lua的相互调用。
二.入门例子
如下是构建这个例子的步骤。
(1)下载ULua源码。
(2)在Unity中新建一个项目,并将ULua源码拷贝到Assets目录下。
(3)将ulua.dll(就是上面提到的C库)放到Assets下的Plugins文件夹中。(没有Plugins文件夹就新建一个)
(4)在Assets下的Script文件夹中新建一个脚本CSharpLuaTest.cs,并将该脚本绑定到Main Camera上。
(5)在CSharpLuaTest.cs中编辑以下内容:
public class CSharpLuaTest : MonoBehaviour { private LuaState luaState = new LuaState(); // 创建lua虚拟机 void Start () { // 在lua虚拟机(全局)中注册自定义函数 this.luaState.RegisterFunction("CSharpMethod", this, this.GetType().GetMethod("CSharpMethod")); // 加载lua文件(绝对路径) this.luaState.DoFile(Application.streamingAssetsPath + "/Test.lua"); // 加载完文件后,使用GetFunction获取lua脚本中的函数,再调用Call执行。 object[] objs = luaState.GetFunction("LuaMethod").Call(999); Debug.Log(string.Format("{0} - {1}" ,objs[0], objs[1])); } //自定义功能函数,将被注册到lua虚拟机中 public string CSharpMethod(int num) { return string.Format("Hello World {0} !" , num+1); } void Update () { } }
(6)在Assets下的StreamingAssets文件夹中新建一个Lua脚本文件Test.lua,打开Test.lua文件,并编辑如下内容:
1 2 3 4 | function LuaMethod(i) s = CSharpMethod(i); --调用C #方法 return i,s; end |
(7)运行Unity项目,则可以看到输出:999 - Hello World 1000 !
三.要点说明
最后简单说一下上面代码的要点:
1.如果一个C#方法要被Lua调用,则首先要将其注册到Lua虚拟机中(LuaState.RegisterFunction)。之后,在Lua中就可以通过注册的名称来调用这个C#方法。
2.如果C#要调用Lua中的函数,则
(1)首先要在Lua虚拟机中加载该函数(LuaState.DoFile)。
(2)拿到目标函数(LuaState.GetFunction)。
(3)执行目标函数(LuaFunction.Call)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2006-04-13 ESFramework介绍之(23)―― AgileTcp