Unity 关于GetComponentsInChildren 利用扩展方法如何避免获取父物体

1:相信大家都有用到GetComponentsInChildren这个方法吧?但是再用这个方法的时候,

       如果GetComponentsInChildre<T>(),

    如果父对象和子对象都存在相同的T,那么这个得到的数组也会包含父对象中的T,这个在很多情况下我们是不要的,

    那么如何解决这个问题呢?


2:解决方法

相信大家要写肯定都会啦,这里我是写了扩展方法(具体C#扩展方法,找度娘啦)

1:首先创建一个MyExtension类,不继承mono(注意static),然后写了一个方法

然后使用

就可以了,不过GetComponentsInChildren有个重载方法,我在这里小提一下
        public T[] GetComponentsInChildren<T>(bool includeInactive);
    这个重载,默认是false,includeInactive=true,那么在获取子对象的时候如果T对象是关闭的仍然可以得到,
如果includeInactive=false, 那么就不会获得关闭的T对象    

 

      

为true的时候

下面我们修改一下自己写的扩展方法(其实没啥修改QAQ)

然后也像原来那么用就行了哈

ok了!!!

### Unity获取隐藏的子游戏对象方法Unity 中,可以通过 `GetComponentsInChildren` 方法来查找指定类型的组件,并通过参数控制是否包含非活动状态的对象。如果目标是获取隐藏的游戏对象,则可以利用此功能结合特定条件筛选。 以下是实现方式的具体说明: #### 使用 GetComponentsInChildren 查找隐藏的子对象 为了获取隐藏的子游戏对象,可以调用 `Transform.GetComponentsInChildren<T>(bool includeInactive)` 方法[^2]。其中,`includeInactive` 参数设为 `true` 可以确保即使子对象处于禁用状态也能被检索到。下面是一个具体的代码示例: ```csharp // 获取当前 Transform 下所有 SpriteRenderer 组件,包括隐藏的子对象 SpriteRenderer[] sprList = transform.GetComponentsInChildren<SpriteRenderer>(true); foreach (var sprite in sprList) { Debug.Log($"Found hidden or active child object: {sprite.gameObject.name}"); } ``` 上述代码会返回当前 GameObject 的所有后代中的 `SpriteRenderer` 组件实例,无论这些对象是否激活。 #### 验证隐藏对象的状态 除了简单地获取隐藏对象外,还可以进一步验证某个对象是否实际处于隐藏状态(即其 `activeSelf` 属性为 false)。以下是一段扩展代码用于打印隐藏对象的信息: ```csharp // 遍历所有子对象并检测隐藏状态 foreach (Transform child in transform) { if (!child.gameObject.activeSelf) { Debug.Log($"Hidden child found: {child.gameObject.name}"); } } ``` 这段脚本遍历了当前 GameObject 所有直接子级,并判断它们是否有未激活的情况。如果有任何子对象满足该条件,则将其名称记录下来以便后续处理。 #### 设置或取消隐藏 当定位到了某些隐藏的目标之后,可能还需要对其进行显示/隐藏的操作。这同样非常容易完成,只需更改对应 GameObject 的 `SetActive()` 函数即可: ```csharp if (!someChildObject.activeSelf) { someChildObject.SetActive(true); // 显示这个隐藏的孩子 } else { someChildObject.SetActive(false); // 或者再次把它藏起来 } ``` 以上就是关于如何在 Unity 场景里寻找那些不可见却依然存在的子物体方法介绍^。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值