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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/100070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亘古难题——前端开发or后端开发

一、引言 前端开发 前端开发是创建WEB页面或APP等前端界面呈现给用户的过程,通过HTML,CSS及JavaScript以及衍生出来的各种技术、框架、解决方案,来实现互联网产品的用户界面交互。 前端开发从网页制作演变而来,名称上有很明显的时…

C语言-数组

C 语言支持数组数据结构,数组是一个由若干相同类型变量组成的有序集合。 这里的有序是指数组元素在内存中的存放方式是有序的,即所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。 在 C 语言中&am…

fastadmin框架如何开启事务

引言: 数据库事务是一种重要的概念,它确保了一组数据库操作要么全部成功,要么全部失败,以保持数据的一致性。FastAdmin框架提供了方便的方式来处理数据库事务,本文将向你展示如何使用它来开启、提交和回滚事务。 第一…

GNU和Linux的关系、 Linux的发行版本、CentOs和RedHat的区别

GNU和Linux的关系 其实,我们通常称之为的"Linux"系统,相对更准确的名称应该称为“GNU/Linux”系统! 一个功能完全的操作系统需要许多不同的组成部分,其中就包括内核及其他组件;而在GNU/Linux系统中的内核就…

物联网AI MicroPython传感器学习 之 MQ136硫化氢传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 MQ136 是一种硫化氢检测传感器,感应范围为 1 - 200ppm。传感元件是 SnO2,它在清洁空气中的电导率较低。当存在 H₂S 气体时,传感器的电导率随着气体浓度的升…

LeetCode 24.两两交换链表中的结点

题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 首先可以特判一下,如果结点数目小于等于1,则直接返回即可,因为数目小于等于1就不需要交换了。 然后我们可以创建一个虚拟的头结点,然…

LeetCode-416-分割等和子集

题目描述: 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 题目链接:LeetCode-416-分割等和子集 解题思路:可以看成是背包问题, 可以看成有nums.le…

数据结构 | 树和森林

树、森林、二叉树相互转换: 树、森林与二叉树的相互转换_森林转化为二叉树的方法_薛定谔的猫ovo的博客-CSDN博客 树的表示法 左孩子——右兄弟(双链表) 双亲表示法(单链表) 孩子链表(单链表) 树…

【力扣2011】执行操作后的变量值

👑专栏内容:力扣刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接:执行操作后的变量值 存在一种仅支持 4 种操作和 1 个变量 …

用IDEA操作数据库--MySQL

IDEA集成了DataGrip的操作数据库的功能 就可以省略我们下载SQLyog/Navicat/DataGrip这些图形化操作工具了 以下是IDEA的使用 输入数据库的用户和密码

陀螺仪传感器解读-Gyro Acce,1

加速度计和陀螺仪的简介 https://www.cnblogs.com/zdxgloomy/articles/4171937.html 加速度计和陀螺仪的使用指南 ,代码部分 https://www.amobbs.com/forum.php?modviewthread&tid5510930&_dsign972b156c 模拟加速度计: 1. Accelerometer prinicple. 加…

Java基本数据类型

Java基本数据类型 1 数值型 整型数据类型 数据类型内存空间(8位1字节)取值范围byte(字节型)8位(1字节)-128~127 (2的8次方)short(短整型)16位(2字节)-32768~3…

算法练习11——买卖股票的最佳时机 II

122. 买卖股票的最佳时机 II 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得…

运维知识点汇总

一.公共基础 linux常用目录 链接一 链接二 linux系统启动 链接一 链接二 LVM 链接一 磁盘挂载 链接一 文件权限 链接一 二.VLAN详解 链接 三.中间件 单体部署: 优点: (1)小团队成型即可完成开发-测试-上线&am…

11.宝塔搭建服务器部署环境

文章目录 安装docker安装宝塔安装mysql安装redisjava环境 安装docker 安装宝塔 运维的好处 安装映射方便 安装mysql 安装redis java环境 nohup java -jar admin.jar &

简单实现接口自动化测试(基于python+unittest)

简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自动化测试有一个大致的了解。 引言 为什么要…

C++实现高性能内存池(二)

文章目录 一、设计内存池二、实现MemoryPool::construct() 实现MemoryPool::deallocate() 实现MemoryPool::~MemoryPool() 实现MemoryPool::allocate() 实现三、与 std::vector 的性能对比一、设计内存池 在上节中,我们在模板链表栈中使用了默认构造器来管理栈操作中的元素内…

MQ - 40 连接器:以MQ Connector为核心搭建数据集成架构的方案设计

文章目录 导图Pre概述连接器是什么数据集成和连接器典型场景: 将 MySQL 中的数据实时同步到 Elasticsearch方案一 使用典型数据集成组件方案二 消息队列连接器方案对比消息队列连接器底层原理分析分布式任务调度平台源 / 目标连接器简单的数据清洗能力Apache Kafka Connector系…

软件行业与就业(导师主讲)

在企业软件应用的整体架构体系中,有一部分被称为中间件,那么什么叫中间件? 中间件(Middleware)是指位于操作系统和应用程序之间的一层软件层,它提供了一组工具和服务,用于简化和增强企业软件应用…

C++中public、protected及private用法

C中public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂。今天本文就来十分分析一下C中public、protected及private用法。 这里我们首先要明白下面几点。 1.类的一个特征就是封装,public和private作用就是…