[Unity踩坑记录] GetComponentInParent() 结果Get到了自己

问题描述

层级结构
在这里插入图片描述

代码

private void Awake()
    {
        // 挂载脚本的子物体locker
        lockerRender = GetComponent<SpriteRenderer>();

		// locker的父物体
        iconRender = GetComponentInParent<SpriteRenderer>();
        iconCollider = GetComponentInParent<Collider>();

		// locker的同级
        iconLightEdge = transform.parent.GetChild(0).gameObject;
        
		// 打印最后Get到的物体的名字
        Debug.Log("lockerRender : " + lockerRender.gameObject.name);
        Debug.Log("iconRender : " + iconRender.gameObject.name);
        Debug.Log("iconCollider : " + iconCollider.gameObject.name);
        Debug.Log("iconLightEdge : " + iconLightEdge.gameObject.name);
    }

输出结果

lockerRender :locker         ✔
iconRender :locker            ✖
iconCollider :icon               ✔
iconLightEdge :lightEdge   ✔

根据代码(GetComponentInParent()),第二行应该输出icon(父物体),但最后输出了自己。

 

问题分析

查看官方API文档,对该方法有以下描述:

Retrieves the component of Type type in the GameObject or any of its parents.
 
This method recurses upwards until it finds a GameObject with a matching component. Only components on active GameObjects are matched.

重点:

  • 逐层向上查找(包括自己
  • 只查找被激活(打钩)的物体

由于locker和icon都具有SpriteRenderer组件,根据文档的说明,GetComponentInParent()将优先获取locker上的SpriteRenderer组件

 

解决方案

手动查找到locker的父物体,然后获取组件

iconRender = transform.parent.GetComponent<SpriteRenderer>();

打印结果:

iconRender :iconRender

正确。

 

 

参考帖子:
官方API:GameObject.GetComponentInParent

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值