2025. 3. 7. 15:30

별생각 없이 프리팹(Prefab)에 들어가는 코드에 들어가는 코드에 다음과 같이 개체를 검색했습니다.

TextMeshProUGUI ItemText = GameObject.Find("ItemText").GetComponent<TextMeshProUGUI>();
ItemText.text = "내용1";

 

 

개체를 3개 생성했는데 첫 번째 개체에만 텍스트가 적용됩니다????

 

 

1. 오류 확인

제가 생각했던 개체에 접근되지 않을 때는 인스턴스 ID(Instance ID)를 확인해 봐야 합니다.

Debug.Log(string.Format("ItemText : {0}, {1}"
            , ItemText.gameObject.GetInstanceID() 	//텍스트 개체
            , this.gameObject.GetInstanceID()));	//내 오브젝트

 

 

텍스트 개체의 아이디가 같은 것을 알 수 있습니다.

 

 

2. 'GameObject.Find'는 전체 계층을 검사한다.

'GameObject.Find'로 검색하면 모든 계층을 검색하게 됩니다.

(참고 : Uniny Documentation - GameObject.Find )

'GameObject.Find'는 프리팹으로 클론된 개체 안에서 사용하여도 계층 구조상 처음 만난 개체를 리턴합니다.

 

제가 의도한 검색을 하려면 프리팹 안에 있는 자식 중에 검색해야 하므로 'gameObject.transform.Find'를 사용해야 합니다.

( 참고 : Uniny Documentation - Transform.Find )

TextMeshProUGUI ItemText 
	= this.gameObject.transform.Find("ItemText")
    	.GetComponent<TextMeshProUGUI>();
ItemText.text = "내용1";

 

 

인스턴스 ID도 다르게 출력되는 것을 알 수 있습니다.

 

 

마무리

보통은 'gameObject.transform.Find'을 사용하기 때문에 이런 문제가 없었는데......

매인 컨트롤러에서 사용하던 코드를 복사해서 사용하다가 이런 문제가 발생했습니다 ㅋㅋㅋㅋㅋㅋㅋㅋ

그래서 찾는데 하루를 날렸버렸....

 

성능 이슈 때문에라도 'GameObject.Find'는 자제하는 게 좋습니다.