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

 

目录
相关文章
|
4月前
|
存储 C# 图形学
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
130 1
|
4月前
|
存储 人工智能 C#
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
【Unity 3D】C#中数组、集合、栈、队列、哈希表、字典的讲解(附测试代码)
66 0
|
4月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
88 1
|
4月前
|
程序员 C# 图形学
【Unity 3D】C#中条件语句if else switch的讲解
【Unity 3D】C#中条件语句if else switch的讲解
122 1
|
21天前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
33 0
|
1月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
3月前
|
C# 图形学 C++
使用vscode开发C#+unity没有代码提示问题
使用vscode开发C#+unity没有代码提示问题
51 0
使用vscode开发C#+unity没有代码提示问题
|
3月前
|
JavaScript 前端开发 C#
初识Unity——创建代码、场景以及五个常用面板(创建C#代码、打开代码文件、场景的创建、Project、Hierarchy、Inspector、Scene、Game )
初识Unity——创建代码、场景以及五个常用面板(创建C#代码、打开代码文件、场景的创建、Project、Hierarchy、Inspector、Scene、Game )
76 0
|
4月前
|
图形学
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】
|
4月前
|
定位技术 C# 图形学
Unity和C#游戏编程入门:创建迷宫小球游戏示例
Unity和C#游戏编程入门:创建迷宫小球游戏示例
133 2

热门文章

最新文章