Unity3D预备知识:C#与Lua相互调⽤
  在使⽤Unity开发游戏以⽀持热更新的⽅案中,使⽤ULua是⽐较成熟的⼀种⽅案。那么,在使⽤ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了?
unity3d入门⼀.基本原理
  简单地说,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⽂件,并编辑如下内容:
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)。   

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。