Unity脚本判断场景内物体是否为Root Prefab的方法

问题

由于如果不是根Prefab,是无法通过PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(gameObject)获得的地址来进行修改后属性的存储的。

所以,如果脚本中需要对修改属性后的Prefabs进行保存,又要避开Prefabs下的part,需要进行对gameobject的判断,判断是否为root Prefab。

探索

但是我试过了很多方法,总会存在情况有一些漏网之鱼:

  1. 直接通过PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(gameObject)获得距离最近的Prefab Object地址,然后通过字符串操作取出文件名,判断当前的Gameobject.name是否与地址中的文件名相符,如果文件名相同,那么就是根prefab,如果不是,说明它存在一个非本身的prefab root。但是不行,会出现这样的情况:
    很抽象,会存在root prefab下包含了一个包含prefab的非prefab,很绕,但是你懂了就能懂了,这样的话,最近的prefab object就成了children prefab自己了,而不是隔了一个非prefab的root prefab。

  2. 通过一些可能成功的函数:尝试过PrefabUtility.IsPartOfAnyPrefab(gameObject),看上去是一个判断它是否是一个Prefab的part的办法,但是!但是root prefab本身也会被判断为是part of a prefab,很气,但是确实也没毛病,所以也不行。

解决方法

最终就不打算找函数了,通过逻辑完成root prefab的寻找。方法就是,首先获得当前scene下的所有Root GameObject,然后对于每个Root GameObject进行children的递归遍历,当遇到第一个为Prefab的gameobject的时候,将其存到一个全局list里面,然后return出当前递归,回溯到上一层递归中的children for,check下一个children。

这样,存到list里面的prefab一定是递归树中最靠近root node的那一个,它的父节点和祖先节点都不存在prefab。于是就得到了一个当前场景下的root prefabs的列表。最终判断一下当前GameObject是否exist在这个列表里就ok了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值