tolua动态注册对象的使用
发表于2018-08-08
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方法。