当前位置:网站首页>xlua获取ugui的button注册click事件

xlua获取ugui的button注册click事件

2022-06-26 18:18:00 wodownload2

local button = self.gameObject.transform:Find("Button"):GetComponent(typeof(CS.UnityEngine.UI.Button))
button.onClick:AddListener(ClickButton)

function ClickButton()
	print("clickbutton")
end

或者:
local button = self.gameObject.transform:Find(“Button”):GetComponent(“Button”)

那如果多个button,但是处理函数都是差不多的,怎么区分是哪个button点击回来的呢?
总不能写n个类似的回调函数吧:
可以使用,如下的方法:

local function OnInitial(self)
	XRNActivityWrapper.gameObject = self.gameObject
	local button = self.gameObject.transform:Find("Button1"):GetComponent(typeof(CS.UnityEngine.UI.Button))
	local openPageCallback = BindCallback(self, XRNActivityWrapper.ClickButton, button)
	button.onClick:AddListener(openPageCallback)

	local button = self.gameObject.transform:Find("Button2"):GetComponent(typeof(CS.UnityEngine.UI.Button))
	local openPageCallback = BindCallback(self, XRNActivityWrapper.ClickButton, button)
	button.onClick:AddListener(openPageCallback)
end

function XRNActivityWrapper:ClickButton(button)
	print("clickbutton")
	print(button.name)
	if (button.name == "Button1") then
        print("hello button1")
    elseif (button.name == "Button2") then
		print("hello button2")
	end
end

在这里插入图片描述

你还可以bind的时候,传递很多参数哦,如下:

local openPageCallback = BindCallback(self, XRNActivityWrapper.ClickButton, button, 123, "nihao")
button.onClick:AddListener(openPageCallback)
function XRNActivityWrapper:ClickButton(button, a, b)
	print("clickbutton")
	print(button)
	print(a)
	print(b)
end

所以就这个BindCallback比较核心:

local unpack = unpack or table.unpack

-- 解决原生pack的nil截断问题,SafePack与SafeUnpack要成对使用
function SafePack(...)
	local params = {
    ...}
	params.n = select('#', ...)
	return params
end

-- 解决原生unpack的nil截断问题,SafePack与SafeUnpack要成对使用
function SafeUnpack(safe_pack_tb)
	return unpack(safe_pack_tb, 1, safe_pack_tb.n)
end

-- 对两个SafePack的表执行连接
function ConcatSafePack(safe_pack_l, safe_pack_r)
	local concat = {
    }
	for i = 1,safe_pack_l.n do
		concat[i] = safe_pack_l[i]
	end
	for i = 1,safe_pack_r.n do
		concat[safe_pack_l.n + i] = safe_pack_r[i]
	end
	concat.n = safe_pack_l.n + safe_pack_r.n
	return concat
end

-- 闭包绑定
function Bind(self, func, ...)
	assert(self == nil or type(self) == "table")
	assert(func ~= nil and type(func) == "function")
	local params = nil
	if self == nil then
		params = SafePack(...)
	else
		params = SafePack(self, ...)
	end
	return function(...)
		local args = ConcatSafePack(params, SafePack(...))
		func(SafeUnpack(args))
	end
end

-- 回调绑定
-- 重载形式:
-- 1、成员函数、私有函数绑定:BindCallback(obj, callback, ...)
-- 2、闭包绑定:BindCallback(callback, ...)
function BindCallback(...)
	local bindFunc = nil
	local params = SafePack(...)
	assert(params.n >= 1, "BindCallback : error params count!")
	if type(params[1]) == "table" and type(params[2]) == "function" then
		bindFunc = Bind(...)
	elseif type(params[1]) == "function" then
		bindFunc = Bind(nil, ...)
	else
		error("BindCallback : error params list!")
	end
	return bindFunc
end

原理就是闭包

原网站

版权声明
本文为[wodownload2]所创,转载请带上原文链接,感谢
https://blog.csdn.net/wodownload2/article/details/125461864