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

publicclass CSharpLuaTest:MonoBehaviour{privateLuaStateluaState =newLuaState();// 创建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虚拟机中  publicstringCSharpMethod(int num) 

    {

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,052评论 0 38
  • 《腾讯桌球:客户端总结》 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东...
    吴秦阅读 24,820评论 12 142
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,942评论 0 27
  • 0. 前言 2016年8月从网易“毕业”,在新的公司开始新的工作,这其中的波折与故事暂时不提,等以后有时间的时候再...
    董夕阅读 4,232评论 8 40
  • 黄河之水天上来 童年之时 谁也未见过黄河 看到渠水 就能想到母亲 她至少养育了我 渐渐地长大了 顺着脉络寻到了黄河...
    执酒共酌阅读 169评论 0 5