• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Unity3d ulua c#与lua交互+wrap文件理解

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

lua调用C#:反射(性能低),Wrap(将C#类变量函数映射到lua,形成一个个静态函数)
Lua->Wrap(luaState将C#类的变量函数注册到luaVM,lua就可以调用了)->C#

C#调用lua,通过Pinvoke调用lua的dll,执行lua脚本(lua,luajit,luaInterface)

转:https://blog.csdn.net/pengdongwei/article/details/50420612

上次已经搭建好了框架,这里开始使用框架,本文会比较长~~因为我搞了一天,也遇到了好多坑

今天主要记录一下 c# 与 lua 的交互~~ 然后配以demo

C# 调用 lua 这个很简单,之前也有说过,这里不废话,直接贴

[csharp] view plain copy
  1. LuaScriptMgr mgr = new LuaScriptMgr ();  
  2. mgr.Start ();  
  3. mgr.DoFile ("LoginUI.lua");  


难点其实是Lua调用c#,以及效率问题

>> 最古老的是使用反射调用,不过由于反射的性能问题,目前基本上不怎么用了

>>wrap调用提升了反射在效率上的不足,但是必须自己去wrap,所以大版本更新是可以用到的,小版本更新目前还是得用到反射

ok~~ 肯定一头雾水,什么是wrap,怎么生成wrap,wrap工作原理是怎样的?(在今天之前我也是如此多的疑惑)


什么是wrap: wrap是对c#类的成员函数,成员变量,通过映射的方式。这里对比一下两个文件


这个是c#文件

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class LoginData  {  
  5.     public string username;  
  6.     public string password;  
  7.     public int id;  
  8.   
  9.     public LoginData(){  
  10.     }  
  11.   
  12.     public LoginData(string username, string password, int id){  
  13.         this.username = username;  
  14.         this.password = password;  
  15.         this.id = id;  
  16.     }  
  17.   
  18.     public void Equip(string username, string password, int id){  
  19.         Debug.Log ("logindata equip log");  
  20.         if (this.username.Equals (username) && password.Equals (password) && this.id == id) {  
  21.             Debug.Log ("C# >>> LoginData = {username = " + this.username + ", password =" + this.password + ", id = " + this.id + " check ok!!!");  
  22.         } else {  
  23.             Debug.Log ("C# >>> LoginData = {username = " + this.username + ", password =" + this.password + ", id = " + this.id + " check error!!!");  
  24.         }  
  25.     }  
  26. }  
这个是wrap过后的文件

[csharp] view plain copy
  1. using System;  
  2. using LuaInterface;  
  3.   
  4. public class LoginDataWrap  
  5. {  
  6.     public static void Register(IntPtr L)  
  7.     {  
  8.         LuaMethod[] regs = new LuaMethod[]  
  9.         {  
  10.             new LuaMethod("Equip", Equip),  
  11.             new LuaMethod("New", _CreateLoginData),  
  12.             new LuaMethod("GetClassType", GetClassType),  
  13.         };  
  14.   
  15.         LuaField[] fields = new LuaField[]  
  16.         {  
  17.             new LuaField("username", get_username, set_username),  
  18.             new LuaField("password", get_password, set_password),  
  19.             new LuaField("id", get_id, set_id),  
  20.         };  
  21.   
  22.         LuaScriptMgr.RegisterLib(L, "LoginData"typeof(LoginData), regs, fields, typeof(object));  
  23.     }  
  24.   
  25.     [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]  
  26.     static int _CreateLoginData(IntPtr L)  
  27.     {  
  28.         int count = LuaDLL.lua_gettop(L);  
  29.   
  30.         if (count == 0)  
  31.         {  
  32.             LoginData obj = new LoginData();  
  33.             LuaScriptMgr.PushObject(L, obj);  
  34.             return 1;  
  35.         }  
  36.         else if (count == 3)  
  37.         {  
  38.             string arg0 = LuaScriptMgr.GetString(L, 1);  
  39.             string arg1 = LuaScriptMgr.GetString(L, 2);  
  40.             int arg2 = (int)LuaScriptMgr.GetNumber(L, 3);  
  41.             LoginData obj = new LoginData(arg0,arg1,arg2);  
  42.             LuaScriptMgr.PushObject(L, obj);  
  43.             return 1;  
  44.         }  
  45.         else  
  46.         {  
  47.             LuaDLL.luaL_error(L, "invalid arguments to method: LoginData.New");  
  48.         }  
  49.   
  50.         return 0;  
  51.     }  
  52.   
  53.     static Type classType = typeof(LoginData);  
  54.   
  55.     [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]  
  56.     static int GetClassType(IntPtr L)  
  57.     {  
  58.         LuaScriptMgr.Push(L, classType);  
  59.         return 1;  
  60.     }  
  61.   
  62.     [MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]  
  63.     static int get_username(IntPtr L)  
  64.     {  
  65.         object o = LuaScriptMgr.GetLuaObject(L, 1);  
  66.         LoginData obj = (LoginData)o;  
  67.   
  68.         if (obj == null

    鲜花

    握手

    雷人

    路过

    鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Lua 笔记13发布时间:2022-07-22
下一篇:
idea运行lua脚本发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap