找回密码
 立即注册
查看: 411|回复: 0

tolua动态注册对象的使用

[复制链接]
发表于 2021-9-28 08:48 | 显示全部楼层 |阅读模式
1.UI中如何使用lua来热更新

对于UI中的热更新,一种是纯资源的替换,这个比较简单,就是直接把资源替换,名字不变即可。还有一种是动态添加或者删除的UI对象,比如在UI预制体中我们会增删UI,这个时候,就不能用FindChild在lua里便利child了,怎么办?这就需要实现动态注册了。
目前见到的lua解决方案中,一种是反射实现,一种是tolua这种预先生成wrap文件。所谓的动态注册,就不能用预先生成wrap文件的方法实现了,因为我们加一个UILable就必须更新C#代码了,可以仿照放射的思想,去实现动态注册。
2.Lua与C#的中间件

前面两篇文章中介绍过,我们仍然使用LuaBehaviour作为Lua与C#交互的中间件。
C#部分代码如下
  1. private void RegisterParams()
  2.     {
  3.         //LuaInstance.Instance.AddFunc(typeof(GameObject));
  4.         m_Lua.LuaRawGetI(LuaIndexes.LUA_REGISTRYINDEX, m_ClassRef);
  5.         for (int i = 0; i < m_allParams.Length; i++ )
  6.         {
  7.             m_Lua.PushObject(m_allParams[i].regObj);
  8.             m_Lua.LuaSetField(-2, m_allParams[i].objName);
  9.         }
  10.     }
复制代码
m_allParams是一个数组,动态添加的GameObject放在数组中,实际的操作需要自己实现重写Inspector,通过拖拽动态的增删数组对象,在Awake或者Start中注册对象,这也是核心部分。  3.Lua代码
  1. FirstLua = {}
  2. setmetatable(FirstLua,{})
  3. function FirstLua:Start()
  4.         local scale = self.spriteTrans.localScale.x
  5.         if scale ~= nil then
  6.                 print("type  ".. scale)
  7.         end
  8.         local Vec3 = Vector3(2,2,2)
  9.         self.spriteTrans.localScale = Vec3
  10.         name = self.sprite.spriteName
  11.         if name ~= nil then
  12.                 print("name  ".. name )
  13.         end
  14. end
复制代码
我们在2中添加了一个UISprite,它一共挂着3个Component,分别是:Transform,UISprite,GameObject,通过选择一个Component,添加到数组中用于注册,注意如果同一个GameObject需要注册多个Componet,这时就需要用不同的名字注册。
4.实际的效果




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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 19:02 , Processed in 0.090604 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表