Golang语言社区--Unity3D学习 第3期 C#与Lua相互调用

mb5fdb0a1b25659 · · 475 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在使用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中编辑以下内容:

  1. public class CSharpLuaTest : MonoBehaviour {


  2.     private LuaState luaState = new LuaState(); // 创建lua虚拟机

  3.    

  4.     void Start ()

  5.     {

  6.         // 在lua虚拟机(全局)中注册自定义函数

  7.         this.luaState.RegisterFunction("CSharpMethod", this, this.GetType().GetMethod("CSharpMethod"));


  8.         // 加载lua文件(绝对路径)  

  9.         this.luaState.DoFile(Application.streamingAssetsPath + "/Test.lua");


  10.         // 加载完文件后,使用GetFunction获取lua脚本中的函数,再调用Call执行。  

  11.         object[] objs = luaState.GetFunction("LuaMethod").Call(999);        

  12.         Debug.Log(string.Format("{0} - {1}" ,objs[0], objs[1]));

  13.     }


  14.     //自定义功能函数,将被注册到lua虚拟机中  

  15.     public string CSharpMethod(int num)   

  16.     {

  17.         return string.Format("Hello World {0} !" , num+1);

  18.     }

  19.    

  20.     void Update () {   

  21.     }

  22. }

(6)在Assets下的StreamingAssets文件夹中新建一个Lua脚本文件Test.lua,打开Test.lua文件,并编辑如下内容:

  1. function LuaMethod(i)

  2. s = CSharpMethod(i); --调用C#方法

  3. return i,s;

  4. 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)。 



有疑问加站长微信联系(非本文作者)

本文来自:51CTO博客

感谢作者:mb5fdb0a1b25659

查看原文:Golang语言社区--Unity3D学习 第3期 C#与Lua相互调用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

475 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传