开发者社区> zhuweisky> 正文

Unity3D 预备知识:C#与Lua相互调用

简介:   在使用Unity开发游戏以支持热更新的方案中,使用ULua是比较成熟的一种方案。那么,在使用ULua之前,我们必须先搞清楚,C#与Lua是怎样交互的了? 一.基本原理   简单地说,c#调用lua, 是c# 通过Pinvoke方式调用了lua的dll(一个C库),然后这个dll执行了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文件,并编辑如下内容:

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

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[✔️]c++和lua相互调用
[✔️]c++和lua相互调用
10 0
原生实现C#和Lua相互调用-Unity3D可用【下】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
157 0
原生实现C#和Lua相互调用-Unity3D可用【中】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
96 0
原生实现C#和Lua相互调用-Unity3D可用【上】
1. 编译Windows下使用的DLL文件 使用VS2015创建一个空的动态链接库项目,删除里面默认创建的几个文件(如果想自定义拓展可用保留),然后把Lua的源码拷贝进来,添加到项目工程中,编译宏需要配置LUA_BUILD_AS_DLL和_CRT_SECURE_NO_WARNINGS。然后就可以编译x86和x64的DLL动态库,整体步骤简单易操作。
184 0
高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库
高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库
13 0
一文讲透 Redis 事务 (事务模式 VS Lua 脚本)
先说结论: Redis 的事务模式具备如下特点: - 保证隔离性; - 无法保证持久性; - 具备了一定的原子性,但不支持回滚; - 一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis 的事务可以保证一致性。 但 Lua 脚本更具备实用场景,它是另一种形式的事务,他具备一定的原子性,但脚本报错的情况下,事务并不会回滚。Lua 脚本可以保证隔离性,而且可以完美的支持**后面的步骤依赖前面步骤的结果**。
23743 0
Lua脚本是干什么的?底层原理是什么?
Lua脚本是干什么的?底层原理是什么?
114 0
【已解决】Java 项目中利用 Redis 配合 Lua 脚本对短信推送消息做推送限制
【已解决】Java 项目中利用 Redis 配合 Lua 脚本对短信推送消息做推送限制
116 0
+关注
zhuweisky
从事软件开发行业十多年,专注于网络通信技术和网络语音视频技术,擅长系统架构设计、系统性能优化等。zhuweisky.cnblogs.com
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
JS 语言在引擎级别的执行过程
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载