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