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

     

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/6705095.html
Copyright © 2011-2022 走看看