精华内容
下载资源
问答
  • tolua

    2018-07-16 16:53:01
    tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信息分析代码并生成包装的类。它是一个用来简化在C#中集成lua的插件,可以自动生成用于在lua中访问Unity的绑定代码,并把C#中的常量、变量、函数、属性...

    tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信息分析代码并生成包装的类。它是一个用来简化在C#中集成lua的插件,可以自动生成用于在lua中访问Unity的绑定代码,并把C#中的常量、变量、函数、属性、类以及枚举暴露给lua。它是从cstolua衍变而来。从它的名字可以看出,它是集成了原来的tolua代码通过二次封装写了一个C#与tolua(c)的一个中间层。

    All problems in computer science can be solved by another level of indirection, except of course for the problem of too many indirections

    基础

    要想了解tolua#是如何集成的我们需要对C#的一些特性有一些了解,比如了解C#与原生代码交互的方式等。,我们假设读者已经对lua和tolua++有一个比较熟悉,我们略过lua与c或者C++的交互方式,主要介绍一些C#的特性,来帮助我们接下来分析tolua#的集成原理。

    C#特性

    Attribute

    Attribute 是一种可由用户自由定义的修饰符(Modifier),可以用来修饰各种需要被修饰的目标。特性Attribute 的作用是添加元数据。元数据可以被工具支持,比如:编译器用元数据来辅助编译,调试器用元数据来调试程序。Unity以及tolua#中就会用Attribute来辅助做一些事情。

    值类型与引用类型

    只所以要提这两个概念,是因为很好得理解这两个概念有助于我们写出比较高效的C#代码。

    我们知道,C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。

    引用类型和值类型都继承自System.Object类。不同的是,几乎所有的引用类型都直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType。

    作为所有类型的基类,System.Object提供了一组方法,这些方法在所有类型中都能找到,其中包含toString方法及clone等方法。

    System.ValueType直接继承System.Object,即System.ValueType本身是一个类类型,而不是值类型;System.ValueType没有添加任何成员,但覆盖了所继承的一些方法,使其更适合于值类型。例如,ValueType重写了Equals()方法,从而对值类型按照实例的值来比较,而不是引用地址来比较。

    简单了解了值类型与引用类型那么我们下面来看下C#中的装箱和拆箱的概念。

    装箱和拆箱

    装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。

    1.    装箱在值类型向引用类型转换时发生

    2.    拆箱在引用类型向值类型转换时发生

    1 object objValue = 4;
    2 
    3 int value = (int)objValue;

      

    上面的两行代码会执行一次装箱操作将整形数字常量4装箱成引用类型object变量objValue;然后又执行一次拆箱操作,将存储到堆上的引用变量objValue存储到局部整形值类型变量value中。

    同样我们需要看下IL代码:

    复制代码

    复制代码

     1 .locals init (
     2 
     3 [0] object objValue,
     4 
     5 [1] int32 'value'
     6 
     7 ) //上面IL声明两个局部变量object类型的objValue和int32类型的value变量
     8 
     9 IL_0000: nop
    10 
    11 IL_0001: ldc.i4.4 //将整型数字4压入栈
    12 
    13 IL_0002: box [mscorlib]System.Int32 //执行IL box指令,在内存堆中申请System.Int32类型需要的堆空间
    14 
    15 IL_0007: stloc.0 //弹出堆栈上的变量,将它存储到索引为0的局部变量中
    16 
    17 IL_0008: ldloc.0//将索引为0的局部变量(即objValue变量)压入栈
    18 
    19 IL_0009: unbox.any [mscorlib]System.Int32 //执行IL 拆箱指令unbox.any 将引用类型object转换成System.Int32类型
    20 
    21 IL_000e: stloc.1 //将栈上的数据存储到索引为1的局部变量即value

    复制代码

    复制代码

     

    拆箱操作的执行过程和装箱操作过程正好相反,是将存储在堆上的引用类型值转换为值类型并给值类型变量。

    C#调用原生代码

    因为tolua#底层库是使用的tolua(c语言编写),那么就需要通过C#来调用原生代码,我们从LuaDll.cs中摘取一段代码来演示如何从C#中调用原生代码。

    复制代码

    复制代码

    1 Public class LuaDll
    2 
    3 {
    4 
    5   [DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
    6 
    7   public static extern void lua_close(IntPtr luaState);
    8 
    9 }

    复制代码

    复制代码

     

    其中LUADLL对应的字符串就是tolua,在不同的平台上mono会去加载对应的tolua.dll或者tolua.so等文件并调用对应的函数。具体可以参考mono官方的教程。

    tolua#集成

    tolua#集成主要分为两部分,一部分是运行时需要的代码包括一些手写的和自动生成的绑定代码,另一部分是编辑器相关代码,主要提供代码生成、编译lua文件等操作,具体就是Unity编辑器中提供的功能。用mono打开整个tolua#的工程,文件结构大体如下所示:

     

    Runtime

        Source

            Generate 这个文件里面是生成的绑定代码

            LuaConst.cs 这个文件是一些lua路径等配置文件。

        ToLua

            BaseLua 一些基础类型的绑定代码

            Core 提供的一些核心功能,包括封装的LuaFunction LuaTable LuaThread LuaState LuaEvent、调用tolua原生代码等等。

            Examples 示例

            Misc 杂项,目前有LuaClient LuaCoroutine(协程) LuaLooper(用于tick) LuaResLoader(用于加载lua文件)

            Reflection 反射相关

    Editor

        Editor

            Custom

                CustomSettings.cs 自定义配置文件,用于定义哪些类作为静态类型、哪些类需要导出、哪些附加委托需要导出等。

        ToLua

            Editor

                Extend 扩展一些类的方法。

                ToLuaExport.cs 真正生成lua绑定的代码

                ToLuaMenu.cs Lua菜单上功能对应的代码

                ToLuaTree.cs 辅助树结构

    Generate All 流程

    了解了tolua#的大致文件结构,下面我们来看下tolua#的Generate All 这个功能来分析下它的生成过程。生成绑定代码主要放在ToLuaExport.cs里面,我们并不会对每一个函数进行细致的讲解,如果有什么不了解的地方,可以直接看它的代码。

    GenLuaDelegates函数

    生成委托绑定的代码,它会从CustomSettings.customDelegateList里面取出所有自定义导出的委托列表,然后把CustomSettings.customTypeList里面的所有类型中的委托根据一定规则加入到list中,最后调用ToLuaExport.GenDelegates()方法来生成委托绑定的代码,生成的代码在DelegateFactory.cs文件中。

    由于该函数比较简单,我们这里不做展开,可以直接查看ToLuaExport.cs中的GenDelegates()并配合DelegateFactory.cs来查看。

    GenerateClassWraps 函数

    遍历所有需要导出的类,然后调用ToLuaExport.Generate()方法来生成类的绑定代码。

    下面我们来看下ToLuaExport.Generate()方法,其基本流程如下所示:

    从上面的流程图我们可以看到,整个过程还是比较清楚的,如果这个类是枚举类型,那么它会调用枚举导出的接口,而如果这个类型是一个普通的类,那么它就会调用上图所示的相应的流程将代码导出。至于结构体类型,目前应该是只支持一些特定的结构体,需要在lua中对应一份实现(Assets\ToLua\Lua目录中),当然它生成的代码也有一些依赖于tolua#的核心运行时,我们前面简单的讲解了如何在编辑器中生成绑定代码,接下来我们讲一下它的核心运行时。

    tolua#的核心运行时

    tolua#的运行代码包含SourceàGenerate下面的绑定代码以及ToLuaàBaseType代码以及Core下面的核心代码。接下来我们着重讲一下Core下面的几个主要类。

    LuaAttribute.cs

    我们前面基础知识部分已经讲过,它在tolua#生成绑定代码时做一些标示使用。

    LuaBaseRef.cs

    Lua中对象对应C#中对象的一个基类,主要作用是有一个reference指向lua里面的对象,引用计数判断两个对象是否相等等。

    比如LuaFunction里面的reference是指向lua里面的一个闭包的,而LuaTable的reference是指向lua中的一个table的。

    LuaDll.cs

    这个类的主要作用就是实现了C#调用原生代码的功能,其中的原理我们也在上面的基础章节提到了如何在C#中调用原生代码,这里我们就不展开去讲了。

    LuaState.cs

    这里面是对真正的lua_State的封装,包括初始化lua路径,加载相应的lua文件,注册我们前面生成的绑定代码以及各种辅助函数。

    ObjectTranslator.cs

    接下来,我们着重说一下这个ObjectTranslator这个类,这个类代码不多,它存在的主要意义就是给lua中对C#对象的交互提供了基础,简单来说就是C#中的对象在传给lua时并不是直接把对象暴露给了lua,而是在这个OjbectTranslator里面注册并返回一个索引(可以理解为windows编程中的句柄),并把这个索引包装成一个userdata传递给lua,并且设置元表。具体可以查看tolua_pushnewudata代码,如下所示:

    复制代码

    复制代码

     1 // tolua# 代码
     2 
     3 static void PushUserData(IntPtr L, object o, int reference)
     4 
     5 {
     6 
     7   int index;
     8 
     9   ObjectTranslator translator = ObjectTranslator.Get(L);
    10 
    11   if (translator.Getudata(o, out index))
    12 
    13   {
    14 
    15   if (LuaDLL.tolua_pushudata(L, index))
    16 
    17   {
    18 
    19   return;
    20 
    21   }
    22 
    23   translator.Destroyudata(index);
    24 
    25   }
    26 
    27   index = translator.AddObject(o);
    28 
    29   LuaDLL.tolua_pushnewudata(L, reference, index);
    30 
    31 }
    32 
    33 // tolua++ 代码 
    34 
    35 LUALIB_API void tolua_pushnewudata(lua_State *L, int metaRef, int index)
    36 
    37 {
    38 
    39     lua_getref(L, LUA_RIDX_UBOX);
    40 
    41     tolua_newudata(L, index);
    42 
    43     lua_getref(L, metaRef);
    44 
    45     lua_setmetatable(L, -2);
    46 
    47     lua_pushvalue(L, -1);
    48 
    49     lua_rawseti(L, -3, index);
    50 
    51     lua_remove(L, -2);    
    52 
    53 }

    复制代码

    复制代码

     

     

    而在lua需要通过上面传到lua里面的对象调用C#的方法时,它会调用ToLua.CheckObject或者ToLua.ToObject从ObjectTranslator获取真正的C#对象。下面我们把ToLua.ToObject的代码做个示例:

    复制代码

    复制代码

     1 public static object ToObject(IntPtr L, int stackPos)
     2 
     3 {
     4 
     5   int udata = LuaDLL.tolua_rawnetobj(L, stackPos);
     6 
     7   if (udata != -1)
     8 
     9   {
    10 
    11   ObjectTranslator translator = ObjectTranslator.Get(L);
    12 
    13   return translator.GetObject(udata);
    14 
    15   }
    16 
    17   return null;
    18 
    19 }

    复制代码

    复制代码

     

    总结

    通过对tolua#的简单分析,我们对tolua#是怎么实现lua与Unity交互有了一个基础的认识,如果想对tolua#有一个比较深入的了解,那么就需要我们仔细去研究代码、示例以及用它来实际地去做些东西。

    因为看的时间不是很多,所以理解上难免有错误,如果发现问题还请指正。前段时间也完整实现了一套虚幻4中的使用lua框架,希望有时间的话也能跟大家分享一下,当然如果你有兴趣了解,也可以留言,这样我会尽量抽时间来把实现的具体细节跟大家分享一下。

    展开全文
  • ToLua

    千次阅读 2019-01-21 17:26:59
    Skip to content   Pull requests Issues Marketplace Explore     Sign out  Watch  ...topameng/tolua  Code Issues 3 Pull requests 1 Projects 0 Wiki Insig...

    Skip to content

     

    Sign out

    topameng/tolua

     Code Issues 3 Pull requests 1 Projects 0 Wiki Insights

    The fastest unity lua binding solution

    unityluabindluajittolua

    1.  C# 60.6%
    2.  Lua 39.3%
    3.  Batchfile 0.1%

    C#LuaBatchfile

    Branch: master 

    New pull request

    Create new file

    Upload filesFind file

    Clone or download 

    @topameng

    topameng 更新下群信息

    Latest commit 7a4fe1c 5 days ago

    Type Name Latest commit message Commit time
      Assets 1.0.8.536 dofile 加载文件出错。返回异常 7 days ago
      Luajit 1.0.7.328 加入luajit64在pc64位和ios上编译64位bytecode 2 years ago
      Luajit64 1.0.7.328 加入luajit64在pc64位和ios上编译64位bytecode 2 years ago
      ProjectSettings 1.0.5.173 LuaLooper update略早于默认时序 3 years ago
      Unity5.x/Assets/Plugins 1.0.6.235 去掉5.x分支,增加unity5.x目录 3 years ago
      .gitignore 1.0 3 years ago
      LICENSE Initial commit 3 years ago
      README.md 更新下群信息 5 days ago

     README.md

    tolua#

    tolua# is a Unity lua static binder solution. the first solution that analyzes code by reflection and generates wrapper classes.
    It is a Unity plugin that greatly simplifies the integration of C# code with Lua. which can automatically generate the binding code to access Unity from Lua and map c# constants, variables, functions, properties, classes, and enums to Lua.
    tolua# grows up from cstolua. it's goal is to be a powerful development environment for Unity.
    Support unity4.6.x and Unity5.x all(copy /Unity5.x/Assets to /Assets) 
    If you want to test examples(example 1 is excluded)in mobile, first click menu Lua/Copy lua files to Resources. then build it 
    如果你想在手机上测试例子(例子1除外),首先点击菜单Lua/Copy lua files to Resources, 之后再build. 

    欢迎大家点星支持,谢谢^_^
    有bug 可以到QQ群286510803反馈。 可以加讨论群: 
    ulua&tolua技术交流群① 341746602(已满) 
    ulua&tolua技术讨论群② 469941220(已满) 
    tolua#技术讨论群④ 543826216(已满)
    tolua#技术群 286510803

    Library

    tolua_runtime 
    https://github.com/topameng/tolua_runtime 
    Debugger 
    https://github.com/topameng/Debugger 
    CString 
    https://github.com/topameng/CString 
    protoc-gen-lua 
    https://github.com/topameng/protoc-gen-lua 

    FrameWork and Demo

    LuaFrameWork
    https://github.com/jarjin/LuaFramework_NGUI 
    https://github.com/jarjin/LuaFramework_UGUI 
    XlsxToLua
    https://github.com/zhangqi-ulua/XlsxToLua
    UnityHello
    https://github.com/woshihuo12/UnityHello
    UWA-ToLua
    http://uwa-download.oss-cn-beijing.aliyuncs.com/plugins%2FiOS%2FUWA-iOS-ToLua.zip

    Debugger

    EmmyLua
    https://github.com/tangzx/IntelliJ-EmmyLua
    unity_tolua-_zerobrane_api
    https://github.com/LabOfHoward/unity_tolua-_zerobrane_api

    Packages

     Basics        Math      Data Structures
     luabitop       Quaternion       list
      struct         Vector3        event
      int64          Vector4        slot
      Time          Vector2
    Networking        Ray
     luasocket         Color
     Parsing        Bounds
     lpeg             Mathf
     Protol           Touch
     pblua          RaycastHit

    特性

    • 自动生成绑定代码文件,非反射调用 
    • 大量内建基础类型支持,如枚举,委托,事件,Type, 数组,迭代器等 
    • 支持多种协同形式 
    • 支持所有unity内部类导出,支持委托类型导出 
    • 支持导出自定义,跳过某个空的基类,修改导出名称等 
    • 支持扩展函数自定义导出, 比如DoTween 
    • 支持值类型Nullable导出,包括Nullable<Vector3>等 
    • 支持Lua中function转委托,可以区分需要不同委托的参数的重载函数 
    • 支持c# LuaFunction对象转委托,简化调用方式。 支持无GC的多参数调用形式 
    • 支持重载函数自动折叠, 如:Convert.ToUInt32只导出double参数的函数 
    • 支持重载函数自动排序, 如:参数个数相同, object参数执行级最低, 不会出现错误匹配情况 
    • 支持导出函数重命名, 可以分离导出某个重载函数(可以导出被折叠掉的函数) 
    • 支持使用编辑器类改写导出规则 
    • 支持this数组访问,索引为int可以通过[]访问,其他可使用.get_Item或者.this:get()访问数组成员 
    • 支持委托(事件)+-lua function。支持通过函数接口的Add和Remove委托操作 
    • 支持静态反射操作, 形式同c# 
    • 支持peer表,可在lua端扩展导出的userdata 
    • 支持自定义struct压入和读取,做到无GC,并且结构成员无类型限制, 参考例子24 
    • 支持preloading, 可以通过requie后绑定wrap文件 
    • 支持int64, uint64 
    • 大量的lua数学类型,如Quaternion, Vector3, Mathf等
    • 包含第三方lua扩展,包括luasocket, struct, lpeg, utf8, pb等库 
    • 当lua出现异常,能够同时捕获c#端和lua端堆栈,便于调试 
    • print信息,在编辑器点击日志, 能自动打开对应lua文件 
    • 支持unity所有版本 
    • 支持Lua hook C#相代码实现,一定程度上支持利用Lua代码修改C#端代码的bug暖更新使用说明) 

    快速入门

    在CustomSetting.cs中添加需要导出的类或者委托,类加入到customTypeList列表,委托加入到customDelegateList列表 
    通过设置saveDir变量更改导出目录,默认生成在Assets/Source/Generate/下,点击菜单Lua->Generate All,生成绑定文件 
    在LuaConst.cs中配置开发lua文件目录luaDir以及tolua lua文件目录toluaDir 

    //例子1
    LuaState lua = new LuaState();
    lua.Start();
    lua.DoString("print('hello world')");
    lua.Dispose();
    
    //例子2
    LuaState luaState = null;
    
    void Awake()
    {
        luaState = LuaClient.GetMainState();
    
        try
        {            
            luaState.Call("UIShop.Awake", false);
        }
        catch (Exception e)
        {
            //Awake中必须这样特殊处理异常
            luaState.ThrowLuaException(e);
        }
    }
    
    void Start()
    {
        luaState.Call("UIShop.Start", false);
    }
    local go = GameObject('go')
    go:AddComponent(typeof(UnityEngine.ParticleSystem))
    go.transform.position = Vector3.zero
    go.transform:Rotate(Vector3(0,90,0), UnityEngine.Space.World)
    go.transform:Rotate(Vector3(0, 1, 0), 0)
    
    --DoTween 需要在CustomSetting导出前定义USING_DOTWEENING宏,或者取消相关注释
    go.transform:DORotate(Vector3(0,0,360), 2, DG.Tweening.RotateMode.FastBeyond360)
    
    Shop = {}
    
    function Shop:Awake()
        self.OnUpdate = UpdateBeat:CreateListener(Shop.Update, self)
        UpdateBeat:AddListener(self.OnUpdate)
    end
    
    function Shop:OnDestroy()
        UpdateBeat:RemoveListener(self.OnUpdate)
    end
    
    function Shop:OnClick()
        print("OnClick")
    end
    
    function Shop:OnToggle()
        print("OnToggle")
    end
    
    function Shop:Update()
    end
    
    --委托
    local listener = UIEventListener.Get(go)
    listener.onClick = function() print("OnClick") end
    listener.onClick = nil
    listener.onClick = UIEventListener.VoidDelegate(Shop.OnClick, Shop)
    listener.onClick = listener.onClick + UIEventListener.VoidDelegate(Shop.OnClick, Shop)
    listener.onClick = listener.onClick - UIEventListener.VoidDelegate(Shop.OnClick, Shop)
    
    local toggle = go:GetComponent(typeof(UIToggle))
    EventDelegate.Add(toggle.onChange, EventDelegate.Callback(Shop.OnToggle, Shop))
    EventDelegate.Remove(toggle.onChange, EventDelegate.Callback(Shop.OnToggle, Shop))
    
    --事件
    local Client = {}
    
    function Client:Log(str)
    end
    
    Application.logMessageReceived = Application.logMessageReceived + Application.LogCallback(Clent.Log, Client)
    Application.logMessageReceived = Application.logMessageReceived - Application.LogCallback(Clent.Log, Client)
    
    --out参数
    local _layer = 2 ^ LayerMask.NameToLayer('Default')
    local flag, hit = UnityEngine.Physics.Raycast(ray, nil, 5000, _layer)
    
    if flag then
        print('pick from lua, point: '..tostring(hit.point))
    end

    这里是更多的示例。

    关于反射

    tolua# 不支持动态反射。动态反射对于重载函数有参数匹配问题,函数排序问题,ref,out 参数问题等等。
    tolua#提供的替换方法是:

    1. preloading, 把你未来可能需要的类型添加到导出列表customTypeList,同时也添加到dynamicList列表中,这样导出后该类型并不会随binder注册到lua中,你可以通过 require "namespace.classname" 动态注册到lua中,对于非枚举类型tolua#系统也可以在第一次push该类型时动态载入,当然也可在过场动画、资源下载、登录、场景加载或者某个的函数中require这个类型。
    2. 静态反射,参考例子22。通过静态反射支持精确的函数参数匹配和类型检查。不会存在重载函数参数混乱匹配错误问题, 注意iOS必须配置好link.xml

    Performance

    平台 属性读写 重载函数 Vector3构造 GameObject构造 Vector3归一化 Slerp
    PC 0.0465:0.15 0.076:0.12 0.02:0.001 0.1:0.14 0.014:0.001 0.10:0.11
    Android 0.16:1.1 0.28:0.76 0.17:0.00035 0.43:0.5 0.21:0.02 0.3:0.06
    iOS 0.04:0.145 0.055:0.11 0.017:0.05 0.074:0.08 0.035:0.11 0.078:0.5

    测试结果为C#:Lua. 环境不同会略有差异。可用数字倍率做参考
    PC: Intel(R) Core(TM) i5-4590 CPU@3.3GHz + 8GB + 64 位win7 + Unity5.4.5p4
    Android: 中兴nubia z9 max(NX512J) + Adnroid5.0.2
    iOS(il2cpp): IPhone6 Plus
    按照1.0.7.355版本更新了测试数据, u5相对u4, 安卓上c#有了不小的提升

    Examples

    参考包内1-24例子

    About Lua

    win, android ios using luajit2.1-beta3. macos using luac5.1.5(for u5.x). 注意iOS未编译模拟器库,请用真机测试

     

    Press h to open a hovercard with more details.

    展开全文
  • 已经重新编译好tolua库 可运行TestLuaProtobuf场景进行测试 tolua# tolua# is a Unity lua static binder solution. the first solution that analyzes code by reflection and generates wrapper classes. It is a...
  • Unity报错 之 ToLua打包:Unable to find tolua DllNotFoundException: tolua

    Unity 报错之 ToLua打包:Unable to find tolua DllNotFoundException: tolua


    最近在学习使用LuaFramework框架,使用其打出的安卓包运行会报下面这个错误,导致程序不能正常运行,日志原文如下图:

    原文


    产生错误的原因 : 使用LuaFramework打安卓包时会报下面这两个错:

    000
    111

    大致译文是:发现的插件具有相同的名称和架构,
    Assets/Plugins/x86/tolua.dll ()Assets/Plugins/x86_64/tolua.dll ()

    Assets/Plugins/Android/libs/armeabi-v7a/libtolua.so (ARMv7) 。和Assets/Plugins/Android/libs/arm64-v8a/libtolua.so (ARMv7)

    主要意思是:分配不同的架构或删除重复的。(插件相互碰撞)

    然后我就删除了Assets\Plugins\x86Plugins\Android\libs\arm64-v8a这个文件

    错误来了,手欠的我把Plugins\Android\libs\arm64-v8a\x86这个文件夹也删除了(也不知道到当时是怎么想的),然后打包出来,运行就会报Unable to find tolua DllNotFoundException: tolua这个错误了,


    我测试成功的Plugins目录:(只删除的上面说的那两个文件夹)

    目录1

    目录

    根本原因: 安卓打包把libulua.so打包进libs/armeabi-v7a 或者 x86

    苹果打包确认libulua.a在Plugins/iOS/或者确认 libulua.a是否在xcode编译列表中

    展开全文
  • tolua编译

    2019-12-22 10:41:16
    lua5.1x源码和tolua源码中.h .c文件都提取出来放到工程中 加入一下两个编译宏: LUA_SOURCE _CRT_SECURE_NO_WARNINGS 在tolua-5.2.4\src\bin\lua\compat.lua中加入 table.unpack = unpack 4 tolua -n testlib ...
    1. lua5.1x源码和tolua源码中.h .c文件都提取出来放到工程中

    2. 加入一下两个编译宏:
      LUA_SOURCE
      _CRT_SECURE_NO_WARNINGS

    3. 在tolua-5.2.4\src\bin\lua\compat.lua中加入
      table.unpack = unpack

    4 tolua -n testlib -o test.cpp test.pkg

    gcc构建:
    首先 --whole-archive 和 --no-whole-archive 是ld专有的命令行参数,gcc 并不认识,要通gcc传递到 ld,需要在他们前面加 -Wl,字串。
    –whole-archive 可以把 在其后面出现的静态库包含的函数和变量输出到动态库,–no-whole-archive 则关掉这个特性。
    比如你要把 liba.a libb.a libc.a 输出到 libabc.dll(或libabc.so)时应该这么写:
    libabc.dll:liba.c libb.a libc.a
    gcc -shared -o $@ -L. -Wl,–whole-archive -la -lb -lc -Wl,–no-whole-archive
    在–whole-archive作用下的库里不能有函数同名。
    -shared 该选项指定生成动态连接库
    -l (小写的l)参数就是用来指定程序要链接的库,-l参数紧接着就是库名

    gcc -c -std=c99 -o file1.o file1.c
    g++ -c -std=c++0x -o file2.o file2.cpp
    g++ -o myapp file1.o file2.o

    展开全文
  • toLua踩坑

    2018-08-12 22:06:00
    toLua踩坑篇 最近工作得用Lua实现逻辑,桥梁用的toLua,踩了很多坑,在这里记录一下。 坑~toLua解析Lua属性 首先我们给出Lua文件的内容,基于toLua Examples 04修改: print('Objs2Spawn is: '..Objs2Spawn) var2...
  • ToLua基础

    2019-08-22 11:49:49
    一、ToLua框架官方案例学习 1.Hello ToLua 创建虚拟机,开启虚拟机,之后就可以运行lua脚本;虚拟机使用完成后要关闭,检查虚拟栈是否为空,析构掉虚拟机,然后将虚拟机赋值null;运行lua脚本的方式:第一种,直接...
  • tolua_runtime

    2018-05-03 19:58:43
    tolua_runtime 版本 20180503,注意是trunk里面的,不是tags里面的。github老是被某些人劫持,下载不下来。缓存于此。
  • tolua_runtime Build pc: build_win32.sh build_win64.h (mingw + luajit2.0.4) android: build_arm.sh build_x86.sh (mingw + luajit2.0.4) mac: build_osx.sh (xcode + luac5.1.5 for luajit can't run on unity...
  • 学习 tolua 需要有 lua 基础。学习 tolua 需要有 lua 基础。学习 tolua 需要有 lua 基础 重要的事情说三遍 //--------------------------------------------------------------------准备工作---------------------...
  • tolua 新版本

    2018-05-24 15:16:35
    unity tolua 相关源码 可供使用。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • toLua在Unity平台上的使用教程 在这里我会结合网上的示例和官方案例进行toLua的使用。
  • tolua报错,cannot open tolua.lua

    千次阅读 2019-05-13 00:55:13
    是因为,ToLua下Lua文件夹不会打包进去,所以在这几个路径下都找不到tolua.lua,需要将tolua/lua这个文件夹拷贝进对应的目录,一般的做法是打成ab包,加载的。 ...
  • tolua reference

    2017-06-09 12:07:00
    Using Lua API and tag method facilities, tolua maps C/C++ constants, external variables, functions, classes, and methods to Lua. How tolua works (1)创建a package file (a C/C++ cleaned head.....
  • 集成Protobuffer3到ToLua

    2020-04-10 17:28:59
    这是一个集成Protobuffer3到ToLua的工具类,用于集成Protobuffer3到tolua环境中,并且兼容5.1-5.3.
  • toLua学习

    2017-09-21 20:10:00
    toLua学习通用的过程//开始LuaState lua = new LuaState();lua.Start();--在这个位置插入lua的具体操作--//结束lua.CheckTop();lua.Dispose();lua = null;1.第一个例子 DoStringlua.DoString("print("Hollo toLua.")...
  • ToLua框架研究

    2020-07-15 17:42:05
    ToLua框架 简介 tolua是腾讯开源的一款用于unity手游的热更新工具,github地址:ToLua 那么就来研究一下这个热更架构。 原理 lua这门脚本语言其实主要就是用来跟其他语言交互的,它的编译器就是c语言写的,几乎可以...
  • unity tolua vscode调试

    2018-06-24 17:48:53
    unity tolua vscode调试,用于高效的开发LuaFramework_UGUI-master工程
  • tolua#-LuaFramework

    2017-07-21 10:17:30
    tolua#-LuaFramework 带UGUI NGUI两个版本
  • tolua对此做了非常全面的安全处理,值得我们去学习。如果我们要自己去做一些C层面的扩展,也必须要对这些底层原理熟记于心,才能避免各种诡异问题。本文作者游蓝海,未经许可禁止转载。文章目录C#调用Lua函数...
  • ToLua_framework_UGUI

    2018-09-24 00:54:20
    ToLua_Framework_UGUI简化版,网络框架用到pomelo。主要是用大神开源的ToLua框架修改的简化版
  • 收集tolua报错

    2020-03-10 19:23:13
    收集tolua报错 在unity 结合 tolua 项目中,游戏发布后,需要统计玩家在游戏执行过程中的lua报错,以便查看我们代码的健壮性。 这时就需要回收tolua报错了。 首先,找到 LuaState.cs 文件 找到 public void ...
  • tolua 实战

    千次阅读 2015-03-06 17:00:56
    toLua++的导出函数如何访问Lua Table 有些函数需要向lua返回多个结果,将这些结果存在table中是理所当然的。因为toLua++已经自动生成了函数的wrapper,所以没办法直接将栈顶table返回给Lua。好在toLua预留了lua_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,948
精华内容 779
关键字:

tolua