tolua动态注册对象的使用

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方法,留待以后补上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值