非也,现在大部分程序应该都是用的动态加载预制体吧,如果做好代码关联,实际并不会出现找不到加载的组件 class,new 一个class 和 调用 class 内的静态创建函数,难道有什么可读性的区别吗?再或者只要有这个 class 的引用,比如 ui_manage.open(ClassA),那么也可以跳转到对应类,如果是动态加载,只要预制体名和类名一致,也可以找到对应类型
缺点就是有可能出现的引用丢失,还有某些独立工作的组件不好溯源需要看节点树
引用丢失除非必要就不要去拖各种属性,我一般都是动态加载的,独立组件那就没办法了,只能自己做好注释,如果是 B 方案添加完依赖的独立组件还需要代码配置属性,而 A 则可以在编辑器直接配置
不,我司一个项目大部分直接把预制体拖拽进编辑器,直接获取。按钮点击也是直接拖拽脚本进去的,根本找不到点击节点,节点引用到处飞,按钮点击用什么什么脚本,然后脚本上挂载了什么预制体,加载到什么地方,全部得看编辑器,更恐怖的是有好几层。这还是流水过亿的项目。你可以想想有多乱。如果不是真的没人看得懂了,他们还不愿意重构,屎山越叠越高,
而如果审计看这样的东西。是直接不合格的
重复遍历的问题,可以维护一个map,并通过反向路径查找解决。比如
A节点路径:root/$A
B节点路径:root/$A/other/$B
先查到A,则 map.set(“root/$A”, A)
再查B,先按路径反向查找,先查 root/$A/other 这部分,通过 map.get(“root/$A/other”) 结果为空时继续查 root/$A,就可以拿到 A ,再按路径正向查即可
先查B的话,还是先按路径反向查找,在map中一直反向查到 map.get(“root”) 为空,开始正向查找,root/$A 符合节点规则,添加到 map,继续向后查,直到 root/$A/other/$B
再查A,直接 map.get(“root/$A”) 就有了
不建议滥用…… 规范起来,首先是代码层面,哪些组件可以互相依赖?其次是依赖的对象需要有选择,可以通过各种方式获取和查找组件,不一定非得全部直接引用。
我来的时候人都看傻了,这也能跑?这也能赚钱?
是可以这样解决,我后面也想改成装饰器,不过我喜欢把节点引用集中起来,比如this.nodes.xxx
赚不赚钱和代码乱不乱没有关系,那个啥全是if的游戏不也能赚钱,忘记名字了
但是项目要走的长远,并且高频次维护,一定得有一套开发效率,审查效率都可行的框架
如果经常变资源名称,用 a 就很舒服,不用改代码,用 b 就不舒服,要改代码,
如果经常变变量名称,用 a 就不舒服,因为要重拖,用 b 就很舒服,不用改变量的值,
要么制定规则限制资源或者限制变量,舒服但导致不灵活,一旦出现需要打破规则的地方,就巨难受
要么无限制,二者都经常变,灵活但是用啥都不舒服,太随意就太乱,容易把握不住
a和b就是按比重取舍,没有最优解,只有最适合具体状况
我觉得你可以把$换成下划线,更方便输入,你的+和-我就抄一下,我之前是用的_p排除,哈哈哈
使用A+B,比重偏向B。
因为有个问题,prefab是资源,而路径可以存储在脚本或配置表
热更时能减少资源量
prefab文件也是不小的
另外还得考虑多人协作,开分支时的同步难度,这个是重点中的重点
我再也不想多分支同步prefab了
别人指的是挂不挂组件的问题,你说的是什么?
不是说挂组件及组件中使用的节点定位问题?
挂组件是避免不了的,比如OnEnable和OnDestry这类生存周期也只能绑定组件才能做,
分歧在于:
1、节点使用FindChild还是直接引用?
2、除了生命周期相关的函数,其他逻辑是否分离到一个与组件没有关系的脚本上?
问题1的情况变更定位节点,需要修改prefab(将另外一个节点引用drop到绑定脚本对应的属性上),这会增加prefab的变更因素,
多人协作分支管理时,prefab分支间同步到目前为止是一个难题,增加一个变更因素就增加一个难度。
问题2在于,多个逻辑,需要绑定多个脚本,每增加一个脚本绑定那也会引用prefab变化,也同时带来非界面变化而导致prefab变化,
prefab变化也同时带来热更新量及同步问题,而仅仅绑定只提供生命周期的脚本,prefab变化可能会降低很多。
出现这个问题只能说是任务分配没做好,不过我支持的也是尽量不要直接用节点引用,除了频繁加载的预制体
不是任务分配问题
我们实际项目中,会时不时出现一种情况:
需求A,我开了分支dev_reqa,需要修改aprefab.pefab
需求B,我开了分支dev_reqb,大部分修改bprefab.prefab,但有个入口在aprefab.prefab上,我也要修改aprefab.prefab
分支dev_reqb完成了,集成回trunk,
dev_reqa每天同步trunk的时候,将需求B的修改aprefab.prefab带过来,这时dev_reqa上已经有aprefab.prefab的修改记录,这时aprefab.prefab就百分之百冲突了
这个工作我一般是合并分支后才做,没有遇到过你说的情况
哪个工作?
aprefab.prefab的合并?
涉及到需要自己修改的公共预制体的情况