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

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)
end

prev(iter):与next(iter)相反
reverse_items():return self.prev, self。与items()相反
erase(value):移除值为value的元素
insert(v, iter):在iter后面插入值为v的元素
head():返回第一个元素的值
tail():返回最后一个元素的值
clone():复制一个list

测试:

--TranScriptInfo.lua
TranScriptInfo = 
{
	id = "0",
	areaName = "0",
	scriptName = "0",
	scriptIcon = "0",
	scriptTable = "0",
	scriptScene = "0"
};
TranScriptInfo.__index = TranScriptInfo

function 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() do
	local v = item.value;
	print(v.id..v.areaName..v.scriptName..v.scriptIcon..v.scriptTable..v.scriptScene);
end

print(" ");

--输出指定值的元素
for item in TranScriptInfoList:items() do
	local v = item.value;
	if(v.areaName == "a1") then
		print(v.id..v.areaName..v.scriptName..v.scriptIcon..v.scriptTable..v.scriptScene);
	end
end

print(" ");

--数字型for
function a()
	local now = nil;
	for i = 1,TranScriptInfoList.length,1 do
		now = TranScriptInfoList:next(now);
		local v = now.value;
		print(v.id..v.areaName..v.scriptName..v.scriptIcon..v.scriptTable..v.scriptScene);
		--print(i);
	end
end

a();


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 then
		local a = {};
		table.insert(a, func);
		EventCenter[eventType] = a;
	else
		table.insert(EventCenter[eventType], func);
	end
end

function EventCenter.RemoveListener(eventType, func)
	local a = EventCenter[eventType];
	if a ~= nil then
		for k, v in pairs(a) do
			if(v == func) then a[k] = nil; end
		end
	end
end

function EventCenter.Dispatch(eventType, ...)
	local a = EventCenter[eventType];
	for k, v in pairs(a) do
		v(...);
	end
end

require "EventCenter"
require "EventType"

function Register1(name, password)
	print("the first function ", name, password);
end

function Register2(name, password)
	print("the second function ", name, password);
end


EventCenter.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进行注册就可以了,使用起来很方便:



  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值