问题描述
层级结构
代码
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
正确。