[C#] 부모의 자식 오브젝트에 없는 컴포넌트 제외하고 접근하지 못하는 이슈
2024. 9. 3.

개선 이전 코드

private void Awake()
{
    examples = GetComponentsInChildren<RectTransform>();
}

private void Start()
{
    foreach (var example in examples)
    {
        float randomValue = Random.Range(0f, 1f);
        example.localScale = new Vector3(1f, randomValue, 1f);
        example.GetComponent<Image>().color = SetChartColor(randomValue);
    }
}

변경 이전 코드의 문제점

  1. 모든 RectTransform 포함: GetComponentsInChildren<RectTransform>()는 모든 하위 RectTransform을 반환. 여기에는 Image 컴포넌트가 없는 객체나 레이아웃 관련 RectTransform도 포함될 수 있다.
  2. Null Reference Exception 가능성: 만약 stickChart.GetComponent<Image>()가 null인 경우, 색상을 변경하려고 할 때 오류가 발생할 수 있다.

 

개선 코드

private void Awake()
{
    examples = GetComponentsInChildren<RectTransform>();
    examples = Array.FindAll(examples, rt => rt.GetComponent<Image>() != null);
}

private void Start()
{
    foreach (var example in examples)
    {
        float randomValue = Random.Range(0f, 1f);
        example.localScale = new Vector3(1f, randomValue, 1f);

        Image image = example.GetComponent<Image>();
        if (image != null)
        {
            image.color = SetChartColor(randomValue);
        }
    }
}

 

변경 이후 코드의 개선점`

  1. 필터링 추가: Array.FindAll을 사용해 Image 컴포넌트를 가진 RectTransform만 배열에 남긴다. 이로 인해 색상 변경 작업이 올바른 대상에만 수행된다.
  2. 안전한 접근: Start 메서드에서 stickChart.GetComponent<Image>()가 null이 아닌지 확인한 후에 색상을 설정한다. 이로 인해 예기치 않은 Null Reference Exception을 방지할 수 있다.

요약

  • 변경 이전 코드: 모든 RectTransform에 대해 작업을 수행하며, Image가 없는 요소에서도 색상을 설정하려다 오류가 발생할 수 있음.
  • 변경 이후 코드: Image가 있는 RectTransform만 선택하여, 안전하게 색상과 스케일을 변경함.