C#与lua的相互调用(转)

转载 2018年04月16日 09:42:50

在使用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)。  

深入浅出Lua编程实战视频课程:(3)lua编译器源代码赏析

-
  • 1970年01月01日 08:00

lua语言C#调用

  • 2016年01月28日 15:11
  • 151KB
  • 下载

lua 函数参数传递

lua中,所有类型值都会直接复制传递,类似于java的传递机制,无C/C++中的引用表示。如果想达到函数内部修改的效果,可以通过传递"指针"来完成。这里的指针指的是表这样的数据结构...
  • Vis_Stu
  • Vis_Stu
  • 2018-02-11 15:08:07
  • 46

lua与C相互调用例子程序

  • 2010年07月20日 10:32
  • 66KB
  • 下载

菜鸟入门之lua与c++相互调用(包含多个demo)

前两篇文章中,已经介绍了使用vs2010编译lua5.1源码生成lua.lib 和 vs项目中使用c++调用lua,可以保证demo在vs上运行起来了。这里再详细介绍下c++和lua之间的相互调用以及...
  • wangbin_jxust
  • wangbin_jxust
  • 2014-08-24 11:11:42
  • 1846

Lua与OC相互调用

下面将讲解一下如何在iOS里调用Lua函数,以及Lua函数如何调用iOS本地函数。 转载请注明出处。原文出处 http://www.cnblogs.com/winewind/archive/2012/...
  • stone4354
  • stone4354
  • 2017-05-16 15:10:15
  • 464

【Unity+Lua】实测如何性能优化(Lua和C#交互篇)

前言 在看了uwa之前发布的《Unity项目常见Lua解决方案性能比较》,决定动手写一篇关于lua+unity方案的性能优化文。 整合lua是目前最强大的unity热更...
  • swj524152416
  • swj524152416
  • 2017-05-03 16:57:45
  • 1558

android 与 lua 相互调用

  • 2013年11月20日 21:52
  • 734KB
  • 下载

将lua的table表转化为C#HashTable

Lua的table 表格式 local myParams = { animation = { duration = 10.0; time_function = "ease-in"; dela...
  • jinsenianhua2012
  • jinsenianhua2012
  • 2015-01-21 20:18:53
  • 2668

Lua和Java的相互调用(配置)

Lua的所有库都是用C语言写的,所以Lua和C/C++的相互调用是天生就能实现的,但标准的Lua并不支持和Java的相互调用,值得庆幸的是某些大神帮我们做好了一个luajava库能实这一功能。这个库是...
  • mythslove
  • mythslove
  • 2014-01-17 00:14:29
  • 1684
收藏助手
不良信息举报
您举报文章:C#与lua的相互调用(转)
举报原因:
原因补充:

(最多只允许输入30个字)