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

  • 相关阅读:
    2022杭电多校九 1008-Shortest Path in GCD Graph(质因子+容斥)
    github国内加速访问有效方法
    微信3.7版小程序数据分析
    腾讯云弹性公网IP是什么?EIP是什么意思?
    【机器学习】正规方程与梯度下降API及案例预测
    ArrayList vs. LinkedList:数据结构之争
    一条SQL语句的执行过程(附一次两段式提交)
    机器人开发--Universal Scene Description(USD)
    【AGC】引导用户购买提升用户留存率
    MSP430F5529库函数定时器A——硬件PWM
  • 原文地址:https://blog.csdn.net/weixin_46052886/article/details/133752931