zoukankan      html  css  js  c++  java
  • Unity3D 预备知识: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中编辑以下内容:

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

     

  • 相关阅读:
    二叉树中序遍历 2021.4.14
    简单题 好数对题目 2021.4.13
    2021.4.3 在排序数组中查找元素的第一个和最后一个位置
    力扣刷题记录2021.4.13 最富有客户的资产总量
    iOS开源项目阅读整理
    Missing iOS Distribution signing identity解决方案
    微信票选项目遇到的坑
    [转]从此爱上iOS Autolayout
    [转]iOS应用性能调优的25个建议和技巧
    iOS中用json接收图片的二进制流
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/6705095.html
Copyright © 2011-2022 走看看