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了。

你可能感兴趣的:(Unity,VR,unity,游戏引擎,vr)