{"id":13662143,"url":"https://github.com/topameng/tolua","last_synced_at":"2025-10-23T18:33:02.009Z","repository":{"id":37431175,"uuid":"45907227","full_name":"topameng/tolua","owner":"topameng","description":"The fastest unity lua binding solution","archived":false,"fork":false,"pushed_at":"2024-01-19T07:45:37.000Z","size":38671,"stargazers_count":3031,"open_issues_count":44,"forks_count":877,"subscribers_count":293,"default_branch":"master","last_synced_at":"2025-04-13T15:59:03.585Z","etag":null,"topics":["luabind","luajit","tolua","unity"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/topameng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-11-10T11:20:34.000Z","updated_at":"2025-04-10T07:03:04.000Z","dependencies_parsed_at":"2024-08-02T05:12:30.233Z","dependency_job_id":"a19e6fdf-3625-4bb8-9c42-8790a32f81c0","html_url":"https://github.com/topameng/tolua","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topameng%2Ftolua","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topameng%2Ftolua/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topameng%2Ftolua/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/topameng%2Ftolua/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/topameng","download_url":"https://codeload.github.com/topameng/tolua/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254219373,"owners_count":22034397,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["luabind","luajit","tolua","unity"],"created_at":"2024-08-02T05:01:50.464Z","updated_at":"2025-10-23T18:32:56.972Z","avatar_url":"https://github.com/topameng.png","language":"C#","funding_links":[],"categories":["Embed-Script/VM/","C\\#","C#","C# #"],"sub_categories":["Lua"],"readme":"## tolua#\r\n\r\ntolua# is a Unity lua static binder solution. the first solution that analyzes code by reflection and generates wrapper classes.\u003cbr\u003e\r\nIt 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.\u003cbr\u003e\r\ntolua# grows up from cstolua. it's goal is to be a powerful development environment for Unity.\u003cbr\u003e\r\nSupport unity4.6.x and Unity5.x all(copy /Unity5.x/Assets to /Assets) \u003cbr\u003e\r\nIf you want to test examples(example 1 is excluded)in mobile, first click menu Lua/Copy lua files to Resources. then build it \u003cbr\u003e\r\n如果你想在手机上测试例子(例子1除外)，首先点击菜单Lua/Copy lua files to Resources， 之后再build. \u003cbr\u003e\r\n\r\n欢迎大家点星支持，谢谢^_^\u003cbr\u003e\r\n有bug 可以到QQ群286510803反馈。 可以加讨论群: \u003cbr\u003e\r\nulua\u0026tolua技术交流群① 341746602(已满) \u003cbr\u003e\r\nulua\u0026tolua技术讨论群② 469941220(已满)  \u003cbr\u003e\r\ntolua#技术讨论群④ 543826216(已满)\u003cbr\u003e\r\ntolua#技术群 286510803\u003cbr\u003e\r\n\r\n\r\n# Library\r\n**tolua_runtime** \u003cbr\u003e\r\nhttps://github.com/topameng/tolua_runtime \u003cbr\u003e\r\n**Debugger** \u003cbr\u003e\r\nhttps://github.com/topameng/Debugger \u003cbr\u003e\r\n**CString** \u003cbr\u003e\r\nhttps://github.com/topameng/CString \u003cbr\u003e\r\n**protoc-gen-lua** \u003cbr\u003e\r\nhttps://github.com/topameng/protoc-gen-lua \u003cbr\u003e\r\n\r\n# FrameWork and Demo\r\n**LuaFrameWork**\u003cbr\u003e\r\nhttps://github.com/jarjin/LuaFramework_NGUI \u003cbr\u003e\r\nhttps://github.com/jarjin/LuaFramework_UGUI \u003cbr\u003e\r\n**XlsxToLua**\u003cbr\u003e\r\nhttps://github.com/zhangqi-ulua/XlsxToLua\u003cbr\u003e\r\n**UnityHello**\u003cbr\u003e\r\nhttps://github.com/woshihuo12/UnityHello\u003cbr\u003e\r\n**UWA-ToLua**\u003cbr\u003e\r\nhttp://uwa-download.oss-cn-beijing.aliyuncs.com/plugins%2FiOS%2FUWA-iOS-ToLua.zip\u003cbr\u003e\r\n\r\n# Debugger\r\n**EmmyLua**\u003cbr\u003e\r\nhttps://github.com/tangzx/IntelliJ-EmmyLua\u003cbr\u003e\r\n**unity_tolua-_zerobrane_api**\u003cbr\u003e\r\nhttps://github.com/LabOfHoward/unity_tolua-_zerobrane_api\u003cbr\u003e\r\n\r\n# Packages\r\n　**Basics**　　　　　　　　**Math**　　　　　　**Data Structures**\u003cbr\u003e\r\n　luabitop　　　　　　　Quaternion　　　　　　　list\u003cbr\u003e\r\n　 struct　　　　　　　 　Vector3　　　　　　　　event\u003cbr\u003e\r\n　 int64　　　　 　　　  　Vector4　　　　　　　　slot\u003cbr\u003e\r\n　 Time　　　　 　　　  　Vector2\u003cbr\u003e\r\n**Networking**　　　　 　　　Ray\u003cbr\u003e\r\n　luasocket　　　　 　　　 Color\u003cbr\u003e\r\n　**Parsing**　　　　 　　　Bounds\u003cbr\u003e\r\n　lpeg　　 　　 　　　 　  　Mathf\u003cbr\u003e\r\n　**Protol**　　　　　 　 　　 Touch\u003cbr\u003e\r\n　pblua　　　 　　 　 　RaycastHit\u003cbr\u003e\r\n# 特性\r\n* 自动生成绑定代码文件，非反射调用 \u003cbr\u003e\r\n* 大量内建基础类型支持，如枚举，委托，事件，Type, 数组，迭代器等 \u003cbr\u003e\r\n* 支持多种协同形式 \u003cbr\u003e\r\n* 支持所有unity内部类导出，支持委托类型导出 \u003cbr\u003e\r\n* 支持导出自定义，跳过某个空的基类，修改导出名称等 \u003cbr\u003e\r\n* 支持扩展函数自定义导出, 比如DoTween \u003cbr\u003e\r\n* 支持值类型Nullable导出，包括Nullable\u0026lt;Vector3\u0026gt;等 \u003cbr\u003e\r\n* 支持Lua中function转委托，可以区分需要不同委托的参数的重载函数 \u003cbr\u003e\r\n* 支持c# LuaFunction对象转委托，简化调用方式。 支持无GC的多参数调用形式 \u003cbr\u003e\r\n* 支持重载函数自动折叠, 如:Convert.ToUInt32只导出double参数的函数 \u003cbr\u003e\r\n* 支持重载函数自动排序, 如:参数个数相同, object参数执行级最低, 不会出现错误匹配情况 \u003cbr\u003e\r\n* 支持导出函数重命名, 可以分离导出某个重载函数(可以导出被折叠掉的函数) \u003cbr\u003e\r\n* 支持使用编辑器类改写导出规则 \u003cbr\u003e\r\n* 支持this数组访问，索引为int可以通过[]访问，其他可使用.get_Item或者.this:get()访问数组成员 \u003cbr\u003e\r\n* 支持委托(事件)+-lua function。支持通过函数接口的Add和Remove委托操作 \u003cbr\u003e\r\n* 支持静态反射操作, 形式同c# \u003cbr\u003e\r\n* 支持peer表，可在lua端扩展导出的userdata \u003cbr\u003e\r\n* 支持自定义struct压入和读取，做到无GC，并且结构成员无类型限制, 参考例子24 \u003cbr\u003e\r\n* 支持preloading, 可以通过requie后绑定wrap文件 \u003cbr\u003e\r\n* 支持int64, uint64  \u003cbr\u003e\r\n* 大量的lua数学类型，如Quaternion, Vector3, Mathf等\r\n* 包含第三方lua扩展，包括luasocket, struct, lpeg, utf8, pb等库 \u003cbr\u003e\r\n* 当lua出现异常，能够同时捕获c#端和lua端堆栈，便于调试 \u003cbr\u003e\r\n* print信息，在编辑器点击日志, 能自动打开对应lua文件 \u003cbr\u003e\r\n* 支持unity所有版本 \u003cbr\u003e\r\n* **支持Lua hook C#相代码实现，一定程度上支持利用Lua代码修改C#端代码的bug**（[暖更新使用说明](https://zhuanlan.zhihu.com/p/35124260)） \u003cbr\u003e\r\n\r\n# 快速入门\r\n在CustomSetting.cs中添加需要导出的类或者委托，类加入到customTypeList列表，委托加入到customDelegateList列表 \u003cbr\u003e\r\n通过设置saveDir变量更改导出目录,默认生成在Assets/Source/Generate/下,点击菜单Lua-\u003eGenerate All,生成绑定文件 \u003cbr\u003e\r\n在LuaConst.cs中配置开发lua文件目录luaDir以及tolua lua文件目录toluaDir \u003cbr\u003e\r\n```csharp\r\n//例子1\r\nLuaState lua = new LuaState();\r\nlua.Start();\r\nlua.DoString(\"print('hello world')\");\r\nlua.Dispose();\r\n\r\n//例子2\r\nLuaState luaState = null;\r\n\r\nvoid Awake()\r\n{\r\n    luaState = LuaClient.GetMainState();\r\n\r\n    try\r\n    {            \r\n        luaState.Call(\"UIShop.Awake\", false);\r\n    }\r\n    catch (Exception e)\r\n    {\r\n        //Awake中必须这样特殊处理异常\r\n        luaState.ThrowLuaException(e);\r\n    }\r\n}\r\n\r\nvoid Start()\r\n{\r\n    luaState.Call(\"UIShop.Start\", false);\r\n}\r\n```\r\n```lua\r\nlocal go = GameObject('go')\r\ngo:AddComponent(typeof(UnityEngine.ParticleSystem))\r\ngo.transform.position = Vector3.zero\r\ngo.transform:Rotate(Vector3(0,90,0), UnityEngine.Space.World)\r\ngo.transform:Rotate(Vector3(0, 1, 0), 0)\r\n\r\n--DoTween 需要在CustomSetting导出前定义USING_DOTWEENING宏，或者取消相关注释\r\ngo.transform:DORotate(Vector3(0,0,360), 2, DG.Tweening.RotateMode.FastBeyond360)\r\n\r\nShop = {}\r\n\r\nfunction Shop:Awake()\r\n    self.OnUpdate = UpdateBeat:CreateListener(Shop.Update, self)\r\n    UpdateBeat:AddListener(self.OnUpdate)\r\nend\r\n\r\nfunction Shop:OnDestroy()\r\n    UpdateBeat:RemoveListener(self.OnUpdate)\r\nend\r\n\r\nfunction Shop:OnClick()\r\n    print(\"OnClick\")\r\nend\r\n\r\nfunction Shop:OnToggle()\r\n    print(\"OnToggle\")\r\nend\r\n\r\nfunction Shop:Update()\r\nend\r\n\r\n--委托\r\nlocal listener = UIEventListener.Get(go)\r\nlistener.onClick = function() print(\"OnClick\") end\r\nlistener.onClick = nil\r\nlistener.onClick = UIEventListener.VoidDelegate(Shop.OnClick, Shop)\r\nlistener.onClick = listener.onClick + UIEventListener.VoidDelegate(Shop.OnClick, Shop)\r\nlistener.onClick = listener.onClick - UIEventListener.VoidDelegate(Shop.OnClick, Shop)\r\n\r\nlocal toggle = go:GetComponent(typeof(UIToggle))\r\nEventDelegate.Add(toggle.onChange, EventDelegate.Callback(Shop.OnToggle, Shop))\r\nEventDelegate.Remove(toggle.onChange, EventDelegate.Callback(Shop.OnToggle, Shop))\r\n\r\n--事件\r\nlocal Client = {}\r\n\r\nfunction Client:Log(str)\r\nend\r\n\r\nApplication.logMessageReceived = Application.logMessageReceived + Application.LogCallback(Clent.Log, Client)\r\nApplication.logMessageReceived = Application.logMessageReceived - Application.LogCallback(Clent.Log, Client)\r\n\r\n--out参数\r\nlocal _layer = 2 ^ LayerMask.NameToLayer('Default')\r\nlocal flag, hit = UnityEngine.Physics.Raycast(ray, nil, 5000, _layer)\r\n\r\nif flag then\r\n    print('pick from lua, point: '..tostring(hit.point))\r\nend\r\n```\r\n[这里](Assets/ToLua/Examples/README.md)是更多的示例。\r\n# 关于反射\r\ntolua# 不支持动态反射。动态反射对于重载函数有参数匹配问题，函数排序问题，ref,out 参数问题等等。\u003cbr\u003e\r\ntolua#提供的替换方法是:\u003cbr\u003e\r\n1. preloading, 把你未来可能需要的类型添加到导出列表customTypeList，同时也添加到dynamicList列表中，这样导出后该类型并不会随binder注册到lua中，你可以通过 require \"namespace.classname\" 动态注册到lua中，对于非枚举类型tolua#系统也可以在第一次push该类型时动态载入，当然也可在过场动画、资源下载、登录、场景加载或者某个的函数中require这个类型。\u003cbr\u003e\r\n2. 静态反射，参考例子22。通过静态反射支持精确的函数参数匹配和类型检查。不会存在重载函数参数混乱匹配错误问题, 注意iOS必须配置好link.xml\u003cbr\u003e\r\n\r\n# Performance\r\n|   平台    |   属性读写   | 重载函数  | Vector3构造 |GameObject构造|Vector3归一化|Slerp|\r\n| :-- \t\t| :-----------:|:---------:| :---------: |:-----------: |:----------: |:--: |\r\n| PC  \t\t|  0.0465:0.15 | 0.076:0.12|0.02:0.001   |0.1:0.14\t\t|0.014:0.001  |0.10:0.11|\r\n| Android   |   0.16:1.1  | 0.28:0.76 |0.17:0.00035   |0.43:0.5\t\t|0.21:0.02\t  |0.3:0.06|\r\n| iOS       |  0.04:0.145  | 0.055:0.11 |0.017:0.05   |0.074:0.08\t|0.035:0.11\t  |0.078:0.5|\r\n\r\n测试结果为C#:Lua. 环境不同会略有差异。可用数字倍率做参考\u003cbr\u003e\r\nPC: Intel(R) Core(TM) i5-4590 CPU@3.3GHz + 8GB + 64 位win7 + Unity5.4.5p4\u003cbr\u003e\r\nAndroid: 中兴nubia z9 max(NX512J) + Adnroid5.0.2\u003cbr\u003e\r\niOS(il2cpp): IPhone6 Plus\u003cbr\u003e\r\n按照1.0.7.355版本更新了测试数据, u5相对u4, 安卓上c#有了不小的提升\u003cbr\u003e\r\n# Examples\r\n参考包内1-24例子\r\n\r\n# About Lua\r\nwin, android ios using luajit2.1-beta3. macos using luac5.1.5(for u5.x). \r\n注意iOS未编译模拟器库，请用真机测试\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftopameng%2Ftolua","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftopameng%2Ftolua","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftopameng%2Ftolua/lists"}