找回密码
 立即注册
查看: 168|回复: 5

Unity3d 拖拽赋值组件与通过Find赋值组件的优点与缺点?

[复制链接]
发表于 2023-2-23 06:59 | 显示全部楼层 |阅读模式
Unity3d 拖拽赋值组件与通过Find赋值组件的优点与缺点的评估,来请教下各位大神,大神可以说下自己的观点,你们用的话是一般是怎么样的赋值方式比较多?
发表于 2023-2-23 07:01 | 显示全部楼层
https://github.com/CatImmortal/ComponentAutoBindTool这时候该推荐一手我的组件自动绑定工具了,只要符合定义的规则(支持自定义规则)就可以一键抓取组件引用,运行时组件获取效率相当于拖拽上去的反序列化效率,同时不怕因为层级变更(find的缺点),子物体顺序变更(GetChild(i)的缺点)或者meta丢失(拖拽的缺点)导致的引用错误获取或丢失,还可以自动生成patial的字段定义与组件获取代码),在同时有find和拖拽的优点时又避开了它们的缺点,简直不要太方便好吧。

虽然热更测试还没进行过,不过理论推测上来说应该没啥问题,毕竟prefab上的序列化数据都是直接写进这个prefab的yaml文件里的,只要一开始主包的dll里有这个绑定脚本就ok。
发表于 2023-2-23 07:08 | 显示全部楼层
各有好处吧,拖拽方便,并且耗时会少,find的话不容易造成资源丢失,但是耗时多。
发表于 2023-2-23 07:11 | 显示全部楼层
反对上面说用Find代替拖曳赋值的,这么说的估计都是没做过UI加载优化的。可以自己发布一个真机版测试效率看看,用同样的一个较为复杂的UI做两份分别打包成AssetBundle,用Find方法打印一下加载以及UI Awake的时候Find出所有组件的时间,另一个用序列化方法打印一下加载UI所需时间对比一下就知道了。
Find自动化也自动不到哪去,路径还不是要手动填写?再自动化能避免这一步?除非是Find出所有的根节点。
唯一需要考虑的是序列化后的UI打包成AssetBundle后如果发生改动,会不利于热更新,可能造成代码与资源对应不上。这个要额外写个组件来解决。
发表于 2023-2-23 07:13 | 显示全部楼层
之前的回答没有写详细- -,好吧我背锅。

拖拽的问题:
1.数据储存是放在meta文件中,如果修改了资源和地址你的数据就丢失了,得重新拖拽。脚本拖拽的东西越多丢失后找回来越麻烦
2.没法做自动化处理,任何赋值操作必须人为拖拽
推拽的好处:
1.参数因为是序列化保存的,这样UI可以非常流畅的初始化打开。
2.保存的物体信息和具体路径无关,和他的数据信息有关(比如meta文件里面存储的guid),这样美术人员拖动修改了物体的名字或者位置不会丢弃引用。

Find赋值好处:
所以赋值必须有代码书写,但是可以自己做自动化工具去写代码。而且不易丢失引用资源,所以安全性大大提高。
坏处:
Find()需要耗时,而且很多时候不容易操作。加上因为和路径相关,修改了名字或者路径就会失效。因此需要能方便重新刷新路径的工具脚本支持。

总结:
其实国内如果不是为了热更新,很多时候都是怎么方便怎么来,但是一旦要搞热更新了麻烦就接踵而至。
还是那句话,为了安全性、扩展性、可读性考虑,所以代码的查询组件赋值最好都是通过代码Find去找。为了方便、流畅、和敏捷可以直接拖拽。
最后的最后,优点缺点还不是根据项目框架来定的,有的游戏框架全是Find,也有的游戏框架全是拖拽,利用特性趋利避害而已。
发表于 2023-2-23 07:21 | 显示全部楼层
当然用find,因为ui都在lua里面写
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-6-17 06:34 , Processed in 0.120467 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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