文档章节

uLua中遇到的问题

乐逍遥jun
 乐逍遥jun
发布于 2016/02/22 21:37
字数 649
阅读 17
收藏 0

1.C#调用lua函数参数为空的问题

在C#中调用以(:)定义的函数传参时,self被第一个参数覆盖,而obj将为空

MessagePanel = {};

function MessagePanel:Test1(obj)
	--lua调用正常,obj为传入参数,self为MessagePanel本身
	--C#调用异常,obj为空,self为传入的参数,
	print(type(obj)..type(self))
end

function MessagePanel.Test2(obj)
	--lua和C#调用都是正确的
	print(type(obj))
end



2.C#调用不到Lua父类函数的问题

在Lua中调用table的元表函数是可以的。

在C#中调用Lua中table的元表函数是找不到的。


3.Lua中调用不到C#对象的父类函数

问题原因,

因为父类没有生成wrap

解决办法,

生成所有父类的wrap,注意中间不能间断(父类的父类都需要);


3.Lua中调用不到C#重载函数

问题原因,

在C#中一个类里面有一个没有参数的类成员函数和一个有一个参数的同名静态函数,在这种情况下wrap的生成就会有问题,先上代码

原函数

public Type GetType();
public static Type GetType(string typeName);

生成的wrap函数

static int GetType(IntPtr L)
 {
  int count = LuaDLL.lua_gettop(L);

  if (count == 1)       //注意本行
  {
   Type obj = LuaScriptMgr.GetTypeObject(L, 1);
   Type o = obj.GetType();
   LuaScriptMgr.Push(L, o);
   return 1;
  }
  else if (count == 1 && LuaScriptMgr.CheckTypes(L, 1, typeof(string)))    //注意本行
  {
   string arg0 = LuaScriptMgr.GetString(L, 1);
   Type o = Type.GetType(arg0);
   LuaScriptMgr.Push(L, o);
   return 1;
  }

代码只贴了有用的部分

因为静态函数不用传递调用对象,成员函数需要传递调用对象,所以他们两个的传入参数个数都是1

从判断语句上看这个第二个判断将永远无法进入所以这个静态函数也就无法调用了

解决办法,

a.如果是自己写的代码尽量避开这种写法;

b.如果是SDK的写法找一下有没有其他的相同重载函数;

c.如果a,b都无法解决。。就手动修改这个判断把第一个判断和第二个判断对掉顺序;



4.Lua中报错  function at line xxx has more than 60 upvalues


function at line xxx has more than 60 upvalues。lua的upvalue是有上限的,这个上限定义在luaconf.h中:


/*
@@ LUAI_MAXUPVALUES is the maximum number of upvalues per function
@* (must be smaller than 250).
*/
#define LUAI_MAXUPVALUES    60

当然不建议修改这个值然后重新编译lua了,如果local变量太多,还是放到table里面吧。

luaconf.h中还定义了其他的一些上限,比如这个:

/*
@@ LUAI_MAXVARS is the maximum number of local variables per function
@* (must be smaller than 250).
*/
#define LUAI_MAXVARS        200




© 著作权归作者所有

共有 人打赏支持
乐逍遥jun
粉丝 6
博文 79
码字总数 39510
作品 0
东城
技术主管
私信 提问
Unity lua内存泄漏与性能检测

上周UWA发表了一片博文Lua性能优化—Lua内存优化作者分享了在unity中lua使用的不少干货,文中提到两个lua的小插件,一个是内存检查工具Snapshot,一个是性能分析工具LuaProfiler。 正好上周笔...

tj134679258
2017/05/02
0
0
使用 Unity 3D 开发游戏的架构设计难点

http://geek.csdn.net/news/detail/135019 Unity 3D 引擎对于开发者来说,入手非常快,因为它采用的是 C# 作为开发语言,这也大大降低了开发者的门槛。但凡只要懂一门编程语言的人都能使用 ...

OnafioO
2017/01/20
0
0
ulua,slua,tolua,xlua 等跨语言C#Lua 接口崩溃原因

使用ulua等unity lua 脚本接口工具时,经常会出现各种崩溃 这些崩溃本质上有一个共同模式: C#调用 Lua, Lua调用c#, 接着C#出现异常 也就是跨语言 异常处理上 存在严重问题; ulua,slua等...

李勇2
2018/01/12
0
0
Unity5 + kbengine + ULUA(toLua) 一个KBE的Lua热更新客户端demo

源码: https://github.com/liuxq/StriveGame StriveGame(Unity5 + ULUA + kbengine) 使用Unity+KBEngine开发的mmo游戏demo的第二版,主要工作是将KBE的客户端插件以及大部分游戏逻辑Lua化,...

warma1
2017/07/18
225
0
Unity5 + kbengine + ULUA(toLua) 一个KBE的Lua热更新客户端demo

源码: https://github.com/liuxq/StriveGame StriveGame(Unity5 + ULUA + kbengine) 使用Unity+KBEngine开发的mmo游戏demo的第二版,主要工作是将KBE的客户端插件以及大部分游戏逻辑Lua化,...

warma1
2017/07/18
196
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部