[Unity热更新]tolua# & LuaFramework(三):lua使用list与事件委托

来源:互联网 发布:淘宝网开网店 编辑:程序博客网 时间:2024/04/28 04:57

1.在Assets\LuaFramework\Editor下有CustomSettings.cs,可以将c#类或者枚举注册到lua中,供lua调用

2.当在lua中调用c#的方法,提示参数错误时,可以到对应的wrap文件中看方法需要什么参数

3.当需要生成wrap文件时,不要忘了点击菜单栏Lua/Generate All;当修改了lua文件等资源后,不要忘了点击菜单栏LuaFramework/Build xxx Resource


4.list.lua

在框架中有一个list.lua,它是一个双向链表,即一个元素有两个指针,指向它的前一个元素和后一个元素。这里的元素指的是table,获取值的方式是:xxx.value

a.属性:长度length,指向第一个元素的first以及指向最后一个元素的last

b.方法:

clear():清空push(v):将v添加到list的最后pop:移除最后的元素,并获取它的值unshift(v):将v添加到list的最前shift():移除最前的元素,并获取它的值remove(iter):移除iter这个元素find(v, iter):从iter这个元素开始向后查找,如果找到值为v的,则返回那个元素。如果赋予iter为nil,则从list的第一个元素开始寻找。注意返回的是第一个符合条件的findlast(v, iter):与前面的相反,向前查找next(iter):返回iter的下一个元素,以及那个元素的值,多值返回items():return self.next, self。主要用于遍历(从前往后),例如:local t = list:New()for item in self.items() do    t:push(item.value)endprev(iter):与next(iter)相反reverse_items():return self.prev, self。与items()相反erase(value):移除值为value的元素insert(v, iter):在iter后面插入值为v的元素head():返回第一个元素的值tail():返回最后一个元素的值clone():复制一个list

测试:

--TranScriptInfo.luaTranScriptInfo = {id = "0",areaName = "0",scriptName = "0",scriptIcon = "0",scriptTable = "0",scriptScene = "0"};TranScriptInfo.__index = TranScriptInfofunction TranScriptInfo:new(id,areaName,scriptName,scriptIcon,scriptTable,scriptScene)local o = {};setmetatable(o,self);o.id = id;o.areaName = areaName;o.scriptName = scriptName;o.scriptIcon = scriptIcon;o.scriptTable = scriptTable;o.scriptScene = scriptScene;return o;end


local list = require "list"require "TranScriptInfo"TranScriptInfoList = list:new();a = TranScriptInfo:new(1,"a1","a2","a3","a4","a5");b = TranScriptInfo:new(2,"b1","b2","b3","b4","b5");c = TranScriptInfo:new(3,"a1","c2","c3","c4","c5");TranScriptInfoList:push(a);TranScriptInfoList:push(b);TranScriptInfoList:push(c);--输出所有元素for item in TranScriptInfoList:items() dolocal v = item.value;print(v.id..v.areaName..v.scriptName..v.scriptIcon..v.scriptTable..v.scriptScene);endprint(" ");--输出指定值的元素for item in TranScriptInfoList:items() dolocal v = item.value;if(v.areaName == "a1") thenprint(v.id..v.areaName..v.scriptName..v.scriptIcon..v.scriptTable..v.scriptScene);endendprint(" ");--数字型forfunction a()local now = nil;for i = 1,TranScriptInfoList.length,1 donow = TranScriptInfoList:next(now);local v = now.value;print(v.id..v.areaName..v.scriptName..v.scriptIcon..v.scriptTable..v.scriptScene);--print(i);endenda();


5..委托与事件

1.lua使用“在c#中定义好的事件”

框架中有相关例子


2.lua使用“在lua中定义好的事件”

table操作(详细的可见:http://www.runoob.com/lua/lua-tables.html):



EventType = {Register = 0,Attack = 1}

EventCenter = {};function EventCenter.AddListener(eventType, func)if EventCenter[eventType] == nil thenlocal a = {};table.insert(a, func);EventCenter[eventType] = a;elsetable.insert(EventCenter[eventType], func);endendfunction EventCenter.RemoveListener(eventType, func)local a = EventCenter[eventType];if a ~= nil thenfor k, v in pairs(a) doif(v == func) then a[k] = nil; endendendendfunction EventCenter.Dispatch(eventType, ...)local a = EventCenter[eventType];for k, v in pairs(a) dov(...);endend

require "EventCenter"require "EventType"function Register1(name, password)print("the first function ", name, password);endfunction Register2(name, password)print("the second function ", name, password);endEventCenter.AddListener(EventType.Register, Register1);EventCenter.AddListener(EventType.Register, Register2);EventCenter.Dispatch(EventType.Register, "宏", "哥");EventCenter.RemoveListener(EventType.Register, Register2);EventCenter.Dispatch(EventType.Register, "tay");



3.UI事件

最好使用http://blog.csdn.net/lyh916/article/details/44570503中提供的EventTriggerListener.cs,将这个类和里面的UIDelegate进行注册就可以了,使用起来很方便:



0 0