|
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方法,留待以后补上。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|