Coder Social home page Coder Social logo

tolua's Introduction

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 [email protected] + 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未编译模拟器库,请用真机测试

tolua's People

Contributors

bwb0101 avatar castleyoung avatar ialex32x avatar jcs090218 avatar kensong1194717296 avatar libla avatar newbiegamecoder avatar radiobear avatar tangzx avatar topameng avatar woshihuo12 avatar zhaoboqiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

tolua's Issues

wrap generating error

generating operator[] wrap function will cause compile error,
System.Xml.XmlAttributeCollection for example

tolua C#对象调用了setpeer,无法重载__index函数

我Lua中写了一个扩展c#对象的方法,希望拦截__index的调用,通过使用setpeer无效,大致代码如下:

local peer = tolua.getpeer(node)
if not peer then
    peer = {}
    tolua.setpeer(t, peer)
end

local mt = {}
mt.__index = function(table, key)
-- 自定义查找属性方法
end
setmetatable(peer, mt)

-- 经过测试node.test方法并不会调用我的index函数
node.test

node为c#对象
请问能否支持该特性呢?

关于游戏将要结束时的一些问题

事情是这样的,我写了个Compoent,在OnDestroy里暴露了一个委托,方便在lua里初始化GameObject面板时,直接Add这个Component,然后可以在这个GameObject销毁时,做一些销毁工作

然后当游戏结束的时候,因为LuaState被销毁了,导致委托里对应的LuaFunction在调用时会抛出错误,实际上应该不影响正常游戏,但开发的时候比较尴尬

我不是很清楚应该要怎么处理这个事情(目前临时写了个try-catch)

或者是否有办法判断出委托中哪些是LuaFunction?LuaFunction的是否可以调用的判断是不是可以暴露给用户去做?

使用string.Trim是报错

在lua中使用Trim接口时会报
14: attempt to call method 'Trim' (a nil value)
这个错误
具体例子:
accountInput = find('AccountInput'):GetComponent('UIInput');
log("value type:"..type(accountInput.value));
accountInput.value:Trim();
其中打印的type是lua的string类型:
value type:string
而不是userdata。
这种错误是因为lua的string类型覆盖了C#的吗?
如果是的话,有办法解决吗?
我现在的办法是在lua里实现trim方法,但是感觉有点不顺手~~~
麻烦大神看下,谢谢!

生成代码错误

ToLuaExport.cs 中生成代码部分有一行
fname = beCheckTypes ? "ToParamsString" : "CheckParamsString";

实际 ToLua 中只有ToParamsString, 并没有 CheckParamsString 函数.

wrong string.Format parameter

line 772

        public static void luaL_checkstack(IntPtr L, int space, string mes)
        {
            if (lua_checkstack(L, space) == 0)
            {
                throw new LuaException(string.Format("stack overflow (%s)", mes)); //<- should be {0}
            }
        }

AddExtendType()现在不支持针对接口类型的扩展

比如说我写了一个类
static class ExtendedIDisposable
{
public static void Test (this IDisposable disposable) {}
}

这种, 建议在 ProcessExtendType()方法中加入对接口类型扩展方法的支持,比如 t.IsInterface && t.IsAssignableFrom(type)

可以改到git讨论吗

用QQ群讨论完就找不回来了,为什么不使用issue来讨论,也方便搜索引擎查找

使用UNITY_EDITOR宏的问题

使用UNITY_EDITOR宏限制函数后,build工程的时报错说找不到其中的函数。
UIPanel.cs

if UNITY_EDITOR

static public Vector2 GetMainGameViewSize ()
...

endif

UIPanelWrap.cs
UIPanel' does not contain a definition forGetMainGameViewSize'

这个除了取消宏,有其他方法解决吗,麻烦看下,谢谢

lua脚本中拿到的返回值和c#中不一致

C# 中代码:
lua接口:

[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int GetAttr(IntPtr L)
{
	try
	{
		ToLua.CheckArgsCount(L, 2);
		Giu.Basic.DataType.Entity obj = (Giu.Basic.DataType.Entity)ToLua.CheckObject(L, 1, typeof(Giu.Basic.DataType.Entity));
		string arg0 = ToLua.CheckString(L, 2);
		Giu.Basic.DataType.Var o = obj.GetAttr(arg0);
        if (arg0 == "captain_slot")
        {
            UnityEngine.Debug.LogError(string.Format("LuaGetAttr: {0}=>{1}", arg0, o.Obj));
        }
        ToLua.PushObject(L, o);
		return 1;
	}
	catch(Exception e)
	{
		return LuaDLL.toluaL_exception(L, e);
	}
}

Entity中GetAttr定义:

public Var GetAttr(string name) {
    if(name == "captain_slot")
    {
        UnityEngine.Debug.LogError(string.Format("GetAttr: {0}=>{1}", name, _attrs[def.EntryName2Ind(name)]));
    }
    return _attrs[def.EntryName2Ind(name)];
}

lua中的调用

local key = entity.def.AllAttrNames:GetItem(i)
local entry = entity.def:GetEntry(key)
if table.indexof({"captain_slot"}, key) then
	LogError("__Enter Attr")
end
local attr = entity:GetAttr(key);
if table.indexof({"captain_slot"}, key) then
	if not tonumber(attr:ToString()) then
		local attr2 = entity:GetAttr(key);
        LogError(attr2)
	end
	LogError("__LeaveAttr")
	LogError(key)
	LogError(attr)
end

日志输出:
qq 20170704111343

在c#中的输出都表明GetAttr拿到的时1,而lua中拿到的值时i:base

导出的静态类的静态event不能正确的移除Listener

有一个静态类:
public static class MyClass
{
public static event MyEvent;
}

在Lua中使用:
MyClass.MyEvent = MyClass.MyEvent + MyFunc
MyClass.MyEvent = MyClass.MyEvent - MyFunc

最后移除的时候会报错:
System.Action ev = (System.Action)LuaMisc.GetEventHandler(null, typeof(Scheduler), "FrameEvent");
这个函数LuaMisc.GetEventHandler通过反射GetField是获取不到静态event,每次总是返回空值。

LuaDLL.toluaL_exception 未能反馈System.NullReferenceException到错误日志

我们在Unity 5.5.1测试发现,lua调用已经被销毁的UnityEngine.Object的时候,捕获的Exception的Message成员为空,导致无法输出有意义的错误日志,我们的Fix如下

        public static int toluaL_exception(IntPtr L, Exception e, string msg = null)
        {
            msg = msg == null ? e.Message : msg;
            msg = string.IsNullOrEmpty(msg) ? e.GetType().ToString() : msg; //<- fixed
            LuaException.luaStack = new LuaException(msg, e, 2);            
            return tolua_error(L, msg);
        }

另外,生成的Wrap,比如Text, 所判断的o==null实际上是无法判定UnityEngine.Object被销毁(C++部分)的情况,需要cast成为UnityEngine.Object再判断。

	static int set_supportRichText(IntPtr L)
	{
		object o = null;

		try
		{
#if UNITY_EDITOR
		GameLogic.DebugConfig.Instance.Lua2CSharpeCallCount++;//auto_gen counting lua invoking csharp
#endif
			o = ToLua.ToObject(L, 1);
			UnityEngine.UI.Text obj = (UnityEngine.UI.Text)o;
			bool arg0 = LuaDLL.luaL_checkboolean(L, 2);
			obj.supportRichText = arg0;
			return 0;
		}
		catch(Exception e)
		{
			return LuaDLL.toluaL_exception(L, e, o == null ? "attempt to index supportRichText on a nil value" : e.Message);
		}
	}

T LuaLoadBuffer<T> 方法获取不到lua文件里return的值

不确定lua文件返回多少个值,所以用的是luaState.DoFile<object[]>(filename); 返回了一个object[0]的数组
调试了下,在ToLua的 public static object[] CheckObjectArray(IntPtr L, int stackPos) 方法的 int len = LuaDLL.lua_objlen(L, stackPos); 里返回的长度是0。不知为何

老版的DoFile直接返回object[]的正常

关于1.0.6版修复导出带有out参数的Delegate

看了一下1.0.6的,不算是修复了。

  • out int (valueType)这种不行。
  • 带params的这种参数也不行。
  • 所有返回值(valueType)都调用CheckObject来处理,使用ParameterType.GetElementType()可解决。
  • delegate的返回值是valueType时也有问题。
  • 生成的代码排版也有问题。

Some struct Missing parameter-less constructor to set default values

public LuaByteBuffer(IntPtr source, int len)
            : this()
        {
            buffer = new byte[len];
            Length = len;
            Marshal.Copy(source, buffer, 0, len);
        }
        
        public LuaByteBuffer(byte[] buf)
            : this()
        {
            buffer = buf;
            Length = buf.Length;            
        }

        public LuaByteBuffer(byte[] buf, int len)
            : this()
        {            
            buffer = buf;
            Length = len;
        }

        public LuaByteBuffer(System.IO.MemoryStream stream)
            : this()
        {
            buffer = stream.GetBuffer();
            Length = (int)stream.Length;            
        }
        public LuaDictEntry(K key, V value)
            : this()
        {
            Key = key;
            Value = value;
        }

与PlayServiceResolver的一个兼容问题

PlayServiceResolver是Google的一个unity原生插件管理工具,集成Admob会默认安装它。安装以后,tolua的生成绑定会报出异常。原因是PlayServiceResolver添加了自己的AssemblyResolve事件,在这个事件里出现assembly找不到的情况。而tolua在ToLuaExports.ProcessExtends里用到了GetType,在绑定时有些extends要查询的类名里有“,”,比如ToLua_System_Dictionary<string,string>,GetType就把它当有assembly name的类名,触发AssemblyResolve事件,然后PlayServiceResolver就出异常了。

解决办法很简单只要把

extendName = "ToLua_" + className.Replace(".", "_");

修改为
extendName = "ToLua_" + className.Replace(".", "_").Replace(",", "_");
去掉会产生歧义的逗号就好了。

ToLua.cs里可能存在的一处错误

public static void Push(IntPtr L, object obj)方法的
else if (t == typeof(LayerMask))
{
Push(L, (LayerMask)obj);
}
这里并没有LayerMask的push,造成不断的递归自己,应该是
PushLayerMask(L, (LayerMask)obj);方法吧

luasocket卡顿

使用luasocket接收数据问题,应该怎么解决?
描述:
在第一次执行luasocket.select({self._socket}, ti)和self._socket:receive()时,Unity直接卡死。
这是有一次没有卡死的时间输出,明显第一次调用时间更久,后续的就正常了。无论在lua协程还是Unity协程StartCoroutine都是一样的。
第一次执行select和receive开始的时间和结束时间
14:50:46.21-309: [LuaNetManager.lua:159]:1 receive time: 1508223046.0215
14:50:53.972-309: [LuaNetManager.lua:162]:2 receive time: 1508223053.9727
第二次执行select和receive开始的时间和结束时间
14:50:54.687-352: [LuaNetManager.lua:159]:1 receive time: 1508223054.6877
14:50:54.688-352: [LuaNetManager.lua:162]:2 receive time: 1508223054.6886
第三次执行select和receive开始的时间和结束时间
14:50:55.720-414: [LuaNetManager.lua:159]:1 receive time: 1508223055.7204
14:50:55.721-414: [LuaNetManager.lua:162]:2 receive time: 1508223055.7214

protobuf协议序列化的乱码问题

local roleCheckReq = ClientProto.role_check_req()
xxxxxx。。。。。。。省略字段
local encodeData = roleCheckReq:SerializeToString()
执行SerializeToString()序列化的时候出现uint32字段序列化出来的是乱码
protobuff

如上图,1处的值是1001,经过2的函数之后,在3处的打印出来就是乱码了,理论上应该是1001呀

Generate Error

Unity 2017.3.0f3 on Windows 10

System.ArgumentException: The type 'UnityEngine.RaycastHit&' may not be used as a type argument.

Example 04_AccessingLuaVariables Found A Bug.

环境:
Windows 8.1
Unity 5.3.5f1
在41行代码里,输出map.name是没有值的,我通过修改下面的代码能输入map.name值,这是语言的一个bug?还是就只能这样来获取?

Debugger.Log("Read varTable from lua, default: {0} name: {1} : {2}", table["default"], ((LuaTable)table["map"])["name"], table["map.name"]);

Demo Compatibility

/Assets/ToLua/Examples/17_Inherit/TestInherit.cs
这里面的FindChild方法,在2017上该用Find

关于reimport

现在reimport后会清空掉对应的preload表函数,会不会导致无法实现真正目的。因为声明在CustomSettings的dynamicList中的C#类型的唯一的require进lua脚本的路径已经被截断了,而此时重新require可能不会加载想要的C#组件的东西进来

安卓上面报错LuaException: cannot open tolua.lua: No such file or directory

LuaException: cannot open tolua.lua: No such file or directory
no file './tolua.lua'
no file '/usr/local/share/luajit-2.1.0-beta3/tolua.lua'
no file '/usr/local/share/lua/5.1/tolua.lua'
no file '/usr/local/share/lua/5.1/tolua/init.lua'
no file './Resources/tolua.lua'
no file '/storage/emulated/0/Android/data/com.tolua.test/files/Android/Lua/tolua.lua'
LuaInterface.LuaState:LoadFileBuffer(String)
LuaInterface.LuaState:DoFile(String)
LuaInterface.LuaState:OpenBaseLuaLibs()
LuaInterface.LuaState:Start()
TestPerformance:Start()

                                                   (Filename:  Line: -1)

jit line 0

excuse me ? in luabyte mode , the lua exception cant locate the line number, they r always 0 line,?

print无法打印

实现print的地方如果將Debugger.Log()改成UnityEngine.Debug.Log()則是可以的

求兼容EclipseLDT调试器

大神你好,我喜欢用eclipse, 刚做了一个小工具: https://github.com/ps5mh/tolua-ldtdoc 想刷下存在感.
我发现tolua require文件的时候, 跟标准lua有些出入, 导致不能兼容Eclipse的调试器.
不知能否对static int Loader(IntPtr L) ToLua.cs这个函数做一下修改:
/if (LuaDLL.luaL_loadbuffer(L, buffer, buffer.Length, fileName) != 0)/
if (LuaDLL.luaL_loadbuffer(L, buffer, buffer.Length, "@" + fileName + ".lua") != 0)
使得required之后的文件名在调试信息中变为 @module.lua 这样就像原生lua一样了.

把代码放入单独project中,导致编辑器崩溃的问题

*环境:unity4.7.2f1,VS2015
*步骤:
.我把.cs的代码移动到我新建的VS工程,打算编译一个独立的dll,wrap的导出路径也设置到了新的vs工程中,成功编译
.手动导出wrap,把wrap导入新的VS工程,成功编译
.生成的dll放入Asset中
.测试Hellow World场景,发现tolua.lua加载失败,将ToLua/Lua目录AddSearchPath,成功加载tolua.lua
.再运行后,Unity编辑器崩溃
.跟踪后发现是最后的调用栈是在ToLua.Print(IntPtr L)调用完以后就崩溃了

LuaMisc.cs中的一个方法:CompareLuaDelegate中有一个小的逻辑错误

这是我在测试tolua#中的例子:11_Delegate,时发现的。
具体看我下面的截取代码中注释说明。
static bool CompareLuaDelegate(LuaDelegate a, LuaDelegate b)
{
if (System.Object.ReferenceEquals(a, b))
{
return true;
}

        object l = a;
        object r = b;

        if (l == null && r != null)
        {
            return b.func == null && b.self == null;
        }

        if (l != null && r == null)
        {
            //return a.func == null && b.self == null; // 这句错了,说明: b也就r既然已经是一个null,怎么还能调用它下面的成员self呢。
            return a.func == null && a.self == null;    // 应该改成这样
        }

        if (a.func != b.func || a.self != b.self)
        {
            return false;
        }

        return a.func != null;
    }

1.0.7.376,调用DoFile带返回值的函数出错。

通过
public T DoFile(string fileName),加载的文件
运行到:
protected T LuaLoadBuffer(byte[] buffer, string chunkName)
的CheckValue时抛出如下错误:
1.
LuaException: bad argument #2 (object[] or table expected, got none)
LuaInterface.LuaDLL:luaL_argerror(IntPtr, Int32, String) (at Assets/ToLua/ToLua/Core/LuaDLL.cs:674)
LuaInterface.LuaDLL:luaL_typerror(IntPtr, Int32, String, String) (at Assets/ToLua/ToLua/Core/LuaDLL.cs:688)
LuaInterface.ToLua:CheckObjectArray(IntPtr, Int32) (at Assets/ToLua/ToLua/Core/ToLua.cs:1500)
LuaInterface.LuaState:CheckValue(Int32) (at Assets/ToLua/ToLua/Core/LuaState.cs:1659)
LuaInterface.LuaState:LuaLoadBuffer(Byte[], String) (at Assets/ToLua/ToLua/Core/LuaState.cs:2129)
LuaInterface.LuaState:DoFile(String) (at Assets/ToLua/ToLua/Core/LuaState.cs:629)

20:42:56.584-5: Lua stack top is 1
UnityEngine.Debug:LogWarning(Object)
LuaInterface.Debugger:LogWarning(String)
LuaInterface.Debugger:LogWarning(String, Object)
LuaInterface.LuaState:CheckTop() (at Assets/ToLua/ToLua/Core/LuaState.cs:1135)
LuaLooper:Update() (at Assets/ToLua/ToLua/Misc/LuaLooper.cs:101)

貌似不用带返回值的DoFile不会出现此错误,这问题是我使用问题还是别的原因引起的?因为对这方面不是很了解。
我切到不带返回值会有什么影响吗?

导出DG.Tweening.TweenParams时导出类编译报错

新版本导出DG.Tweening.TweenParams、DG.Tweening.EaseFactory编译报错,报错如下:

ToLua/Source/Generate/DG_Tweening_TweenParamsWrap.cs(189,41): error CS0117: `LuaInterface.ToLua' does not contain a definition for `ToNullable'

发现ToLuaExport.cs中有以下代码:

  else if (varType.IsGenericType && varType.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            Type t = TypeChecker.GetNullableType(varType);

            if (beCheckTypes)
            {
                sb.AppendFormat("{0}{1} {2} = ToLua.ToNullable<{3}>(L, {4});\r\n", head, str, arg, GetTypeStr(t), stackPos);
            }
            else
            {
                sb.AppendFormat("{0}{1} {2} = ToLua.CheckNullable<{3}>(L, {4});\r\n", head, str, arg, GetTypeStr(t), stackPos);
            }
        }

ToLua.cs中并没有相关方法实现

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.