我想,这里的保存,要看是保存到场景,还是保存到prefab。
如果仅仅是保存到场景,那么并不修改prefab,所以不管是保存了B还是C,Prefab以及A都不会改变。
如果是保存到Prefab,那么Prefab和A的string会相应的改变。这样的行为我觉得应该是合理的。
实际的项目中,尤其是网游,UI的嵌套比较复杂。按照现在的设计,需要先作何很多小的Prefab(比如按钮),再利用这些小的Prefab拼大一些的prefab,然后再拼接成为一个完整的界面。如果一个小的prefab需要修改,那么就需要打开所有直接或间接引用到这个prefab的地方(prefab或者scene),手动的修改。这个工作量是很大的,而且是机械性的重复,如果能通过编辑器来实现是最好不过了。
这个功能,以及嵌套的问题,都属于比较高级的需求,而且其中的一些细节对编辑器会带来比较微妙的影响,我理解开发团队对此的顾虑。我建议一方面可以调查一下大家有对这些功能的看法(尤其是有过Unity经验的团队),另一方面能否增加几个接口,让我们可以自己写插件来实现。
接口的话大概需要这些:
- 保存Prefab的事件
- 得到Prefab的所有引用(包括曾经引用过,后来又丢失引用关系的)
- 打开/修改/保存一个Prefab
- 打开/修改/保存一个场景
其中第二条关于引用的记录比较复杂。我的理解应该是在编辑器中实例化Prefab时,在生成的Node和Prefab上互相记录了对方的uuid;在由于某些操作断开引用关西后,又去掉了这个相互的引用记录。
可以考虑在生成的Node上记录一个: originalPrefab,表示这个Node最初是通过哪一个prefab创建出来的。在Prefab上,也可以保存一些所有曾经实例化过的Node的uuid(或者其位于的场景/Prefab的uuid)。
如果担心这个引用记录也会对编辑器产生影响,也可以把这个工作交给插件来做。只要能再增加几个接口即可:
- 创建Prefab的事件
- 实例化Prefab事件(仅针对编辑器)
- 复制Node的事件(需要复制originalPrefab。如果默认复制行为就会复制该属性,可以不需要)
- 删除Node的事件(可选)
- 引用关系丢失的事件(可选。因为我不太清楚具体哪些时候会丢失引用关系)