Unity Lua UI界面封装

lua做UGUI界面控制,找到一个界面的所有要用到的控件去绑定事件或者做控制,如果很原始的Find和GetComponent是一个很痛苦的事情,因为UGUI的界面层级都会嵌的比较深

,有很多的重复操作,感受到Lua的灵活与强大,做了一个界面封装:

 

-- 用于Lua的界面封装类
-- 使用方式:
-- 1、先找到UI的GameObject,例如 local uiObj = GameObject.Find('UIRoot')
-- 2、做lua封装,例如  local view = LuaView.Create(uiObj)
-- 3、然后就可以访问其下的元素,例如:
-- 		访问子元素  view.btnStart.label.gameObject
--		访问子元素上的ui组件 view.btnStart.label.Text
-- 注意:UI的gameObject全路径命名不可完全重复,自身名字不可使用UI组件的名字,否则访问UI的gameObject时会认为是想访问UI组件
LuaView={}

LuaView.keywords={
	['Button']=UnityEngine.UI.Button,
	['GridLayoutGroup']=UnityEngine.UI.GridLayoutGroup,
	['HorizontalLayoutGroup']=UnityEngine.UI.HorizontalLayoutGroup,
	['Image']=UnityEngine.UI.Image,
	['InputField']=UnityEngine.UI.InputField,
	['RawImage']=UnityEngine.UI.RawImage,
	['Scrollbar']=UnityEngine.UI.Scrollbar,
	['ScrollRect']=UnityEngine.UI.ScrollRect,
	['Slider']=UnityEngine.UI.Slider,
	['Text']=UnityEngine.UI.Text,
	['Toggle']=UnityEngine.UI.Toggle,
	['ToggleGroup']=UnityEngine.UI.ToggleGroup,
	['VerticalLayoutGroup']=UnityEngine.VerticalLayoutGroup,
}
local viewIndex

function LuaView.Create(gameObject)
	local o = {}
	setmetatable(o,o)
	o.__index = viewIndex
	--
	o.gameObject = gameObject
	o.transform = gameObject.transform
	--
	return o
end

function viewIndex(view,key)
	local setV,e = loadstring('function setV(view,v) view.' .. key .. '=v end')
	local uiComp = LuaView.keywords[key]
	if uiComp then
		-- 如果是UI组件
		local c = view.gameObject:GetComponent(uiComp)
		c =c or false
		setV(view,c)
		do return c end
	else
		-- 否则是子物体
		local g = view.transform:Find(key)
		g = g or false
		if g then
			local node = LuaView.Create(g.gameObject)
			setV(view,node)
			do return node end
		else
			setV(view,g)
			do return g end
		end
	end
end


测试如下:

 

我用的slua,但是用ulua也一样的,这个也可以用于ngui,改下keywords就行

有朋友问在xLua里怎么用,我简单测试了以下代码应该可用:

-- 用于Lua的界面封装类
-- 使用方式:
-- 1、先找到UI的GameObject,例如 local uiObj = GameObject.Find('UIRoot')
-- 2、做lua封装,例如  local view = LuaView.Create(uiObj)
-- 3、然后就可以访问其下的元素,例如:
-- 		访问子元素  view.btnStart.label.gameObject
--		访问子元素上的ui组件 view.btnStart.label.Text
-- 注意:UI的gameObject全路径命名不可完全重复,自身名字不可使用UI组件的名字,否则访问UI的gameObject时会认为是想访问UI组件
LuaView={}
if _VERSION > 'Lua 5.1' then
	loadstring = load
end

LuaView.keywords={
	['Button']='UnityEngine.UI.Button',
	['GridLayoutGroup']='UnityEngine.UI.GridLayoutGroup',
	['HorizontalLayoutGroup']='UnityEngine.UI.HorizontalLayoutGroup',
	['Image']='UnityEngine.UI.Image',
	['InputField']='UnityEngine.UI.InputField',
	['RawImage']='UnityEngine.UI.RawImage',
	['Scrollbar']='UnityEngine.UI.Scrollbar',
	['ScrollRect']='UnityEngine.UI.ScrollRect',
	['Slider']='UnityEngine.UI.Slider',
	['Text']='UnityEngine.UI.Text',
	['Toggle']='UnityEngine.UI.Toggle',
	['ToggleGroup']='UnityEngine.UI.ToggleGroup',
	['VerticalLayoutGroup']='UnityEngine.VerticalLayoutGroup',
}
local viewIndex

function LuaView.Create(gameObject)
	local o = {}
	setmetatable(o,o)
	o.__index = viewIndex
	--
	o.gameObject = gameObject
	o.transform = gameObject.transform
	--
	return o
end

function viewIndex(view,key)
	local setV,e = loadstring('function setV(view,v) view.' .. key .. '=v end')
	local uiComp = LuaView.keywords[key]
	if uiComp then
		-- 如果是UI组件
		local c = view.gameObject:GetComponent(uiComp)
		c =c or false
		setV(view,c)
		do return c end
	else
		-- 否则是子物体
		local g = view.transform:Find(key)
		g = g or false
		if g then
			local node = LuaView.Create(g.gameObject)
			setV(view,node)
			do return node end
		else
			setV(view,g)
			do return g end
		end
	end
end

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值