GithubHelp home page GithubHelp logo

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

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#对象
请问能否支持该特性呢?

Generate Error

Unity 2017.3.0f3 on Windows 10

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

安卓上面报错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)

导出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中并没有相关方法实现

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);
		}
	}

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;
        }

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[]的正常

生成代码错误

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

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

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不会出现此错误,这问题是我使用问题还是别的原因引起的?因为对这方面不是很了解。
我切到不带返回值会有什么影响吗?

关于reimport

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

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;
    }

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

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"]);

与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(",", "_");
去掉会产生歧义的逗号就好了。

使用UNITY_EDITOR宏的问题

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

if UNITY_EDITOR

static public Vector2 GetMainGameViewSize ()
...

endif

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

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

把代码放入单独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)调用完以后就崩溃了

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}
            }
        }

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

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

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

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

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

print无法打印

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

wrap generating error

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

求兼容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一样了.

使用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方法,但是感觉有点不顺手~~~
麻烦大神看下,谢谢!

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

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

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

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

可以改到git讨论吗

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

jit line 0

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

Demo Compatibility

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

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

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

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

protobuf协议序列化的乱码问题

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

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

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);方法吧

导出的静态类的静态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,每次总是返回空值。

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.