
ScriptableObject를 통해 데이터 테이블 작성GetComponent를 통해 특정 자식을 찾아오는 과정에서 생긴 문제
현재 업그레이드 UI는 다음과 같은 형식으로 구현되어 있다:

나는 슬롯에 스킬 스크립트를 붙이기만 하면 하위 오브젝트들의 정보를 알아서 다 가져올 수 있도록 코드를 짜고 싶었다.
그래서 OnVaildate와 GetComponentInChildren를 통해 하위 오브젝트들의 컴포넌트를 받아와 연결해주려고 했음
문제: 나는 Icon의 Image를 받아오고 싶었는데 GetComponentInChildren로 이미지를 찾아오려니 Slot의 이미지를 받아오는 문제가 발생함

시도: 이번에는 GameObject.Find("Icon")을 통해 Icon의 Image를 찾아오려 했으나 게임오브젝트 자체는 Image 변수 안에 들어가지 않았다.

부분 해결: 이 부분은 Find로 찾아온 게임 오브젝트에 다시 GetComponent를 시도하는 것으로 해결했다.

문제2: Icon을 찾아오긴 하는데 다른 슬롯의 Icon을 찾아오기 시작...

추정원인: GameObject.Find는 검색 대상이 씬 전체이므로 마지막으로 실행되는 Slot(2)의 Icon을 찾아오게 되는 것 같았다.
해결: GameObject.Find대신 transform.Find를 사용했더니 자식의 Icon을 잘 찾아왔다.

GameObject.Find와 transform.Find의 차이점:
항목 GameObject.Find("Icon")transform.Find("Icon")검색 대상 씬 전체 자신의 자식들만 검색 방식 이름으로 전역 탐색 자식 Transform만 탐색 성능 ❌ 느림 (전역 탐색) ✅ 빠름 (로컬 탐색) Null 발생 많음 (이름 중복/없으면 실패) 안정적 (구조만 알면 정확히 탐색 가능) 경로 지원 ❌ 단일 이름만 가능 ✅ "Child/Grandchild"처럼 경로 탐색 가능
완성된 코드는 다음과 같다:
private void OnValidate() { skillImage = transform.Find("Icon")?.GetComponent<Image>(); levelupBtn = transform.Find("LevelUpBtn")?.GetComponent<Button>(); btnText = levelupBtn.GetComponentInChildren<TextMeshProUGUI>(); _name = transform.Find("Name")?.GetComponent<TextMeshProUGUI>(); description = transform.Find("Description")?.GetComponent<TextMeshProUGUI>(); skillImage.sprite = data.Icon; if (data == null) return; switch(data.type) { case SkillType.PercentageBuff: levelupBtn.onClick.AddListener(LevelUpPercentageBuff); break; case SkillType.TimedActive: levelupBtn.onClick.AddListener(LevelUpTimedActive); break; } }
this로 접근하고, 어떤건 transform으로 접근하고, 어떤건 gameObject 접근하는게 헷갈린다... 였는데, 유니티를 배우기 시작한지 꽤 지났는데도 내가 아직도 이런 부분을 제대로 이해하지 못한 채로 넘어갔다는 것을 새삼 깨달았다.