tolua动态注册对象的使用

发表于2018-08-08
评论0 3.9k浏览
1、UI中如何使用lua来热更新

对于UI中的热更新,一种是纯资源的替换,这个比较简单,就是直接把资源替换,名字不变即可。还有一种是动态添加或者删除的UI对象,比如在UI预制体中我们会增删UI,这个时候,就不能用FindChild在lua里便利child了,怎么办?这就需要实现动态注册了。

目前见到的lua解决方案中,一种是反射实现,一种是tolua这种预先生成wrap文件。所谓的动态注册,就不能用预先生成wrap文件的方法实现了,因为我们加一个UILable就必须更新C#代码了,可以仿照放射的思想,去实现动态注册。

2、Lua与C#的中间件

使用LuaBehaviour作为Lua与C#交互的中间件。

C#部分代码如下
private void RegisterParams()
    {
        //LuaInstance.Instance.AddFunc(typeof(GameObject));
        m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);
        for (int i = 0; i < m_allParams.Length; i++ )
        {
            m_Lua.PushObject(m_allParams[i].regObj);
            m_Lua.LuaSetField(-2, m_allParams[i].objName);
        }
    }

m_allParams是一个数组,动态添加的GameObject放在数组中,实际的操作需要自己实现重写Inspector,通过拖拽动态的增删数组对象,在Awake或者Start中注册对象,这也是核心部分。

3、Lua代码
FirstLua = {}
setmetatable(FirstLua,{})
function FirstLua:Start()
	local scale = self.spriteTrans.localScale.x
	if scale ~= nil then
		print("type  ".. scale)
	end
	local Vec3 = Vector3(2,2,2)
	self.spriteTrans.localScale = Vec3
	name = self.sprite.spriteName
	if name ~= nil then
		print("name  ".. name )
	end
end

我们在2中添加了一个UISprite,它一共挂着3个Component,分别是:Transform,UISprite,GameObject,通过选择一个Component,添加到数组中用于注册,注意如果同一个GameObject需要注册多个Componet,这时就需要用不同的名字注册。

4、实际的效果

在lua中获取localScale,然后设置scale为2,最终结果如上图

5、其它

同理,我们还可以注册LuaBehaviour,在lua中调用其它behaviour里的C#方法和lua方法。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引