문제점
GameObject가 비활성화 상태였는데. Find함수로 찾으려니 안찾아졌다.
해결방법
비활성화 된 객체를 활성화시키려면, 활성화된 부모를 찾아서 자식을 찾는 형식으로 접근해야 합니다. 참고로, 비활성화 된 게임오브젝트에 부모가 없는 경우라면 활성화된 빈 오브젝트를 만들고 비활성화된 오브젝트를 빈 오브젝트의 자식으로 만들면 문제를 해결할 수 있습니다.
(당연한 말이지만, 스크립트 컴포넌트가 활성화되어 있는 곳에서 호출해야 한다. 즉, Cube 게임오브젝트에 스크립트 컴포넌트를 넣어놓고 Cube를 SetActive를 통해 비활성화시킨뒤, 다시 켜도록하면 당연히 켜지지 않는다. Cube게임오브젝트의 스크립트 컴포넌트까지 같이 꺼져버리기 때문.)
씬에는 Plane, CubeParent그리고 CubeParent를 부모로 갖는 Cube게임오브젝트가 있습니다.
Plane에는 NewBehaviourScript컴포넌트를 붙여놓았습니다.
1. FindChild를 사용하는 방법. (권장되지 않음)
public class NewBehaviourScript : MonoBehaviour
{
private Transform cube;
void Start()
{
cube = GameObject.Find("CubeParent").transform.Find("Cube");
}
void Update()
{
if(Input.GetMouseButtonDown(0)) // 마우스 왼쪽 클릭
{
cube.gameObject.SetActive(false);
}
if(Input.GetMouseButtonDown(1)) // 마우스 오른쪽 클릭
{
GameObject.Find("CubeParent").transform.FindChild("Cube").gameObject.SetActive(true);
}
}
}
GameObject.Find("찾을게임오브젝트의 부모게임오브젝트").transform.FindChild("찾을게임오브젝트").gameObject.SetActire(true or false)의 형태로 사용합니다.
위의 코드처럼 GameObject.Find("UI")를 통해 부모를 찾고, transform.FindChild("자식오브젝트이름")을 통해 비활성화된 객체를 찾아갈 수 있습니다.
FindChild를 사용하면 노란줄을 그어주면서 FindChild함수 대신 Find함수를 사용하라고 합니다.
2. Find함수 사용
GameObject.Find("CubeParent").transform.Find("Cube").gameObject.SetActive(true);
1번 방법에서 Findchild부분을 Find함수로만 바꾸어 주면됩니다.
3. GetChild를 사용하는 방법
if(Input.GetMouseButtonDown(1)) // 마우스 오른쪽 클릭
{
GameObject.Find("CubeParent").transform.GetChild(0).gameObject.SetActive(true);
}
GetChild함수는 주어진 매개변수의 숫자에 해당하는 자식을 반환합니다. 현재 "Cube"오브젝트는 CubeParent의 0번째 자식이므로 위의 코드는 정상작동합니다.
결과
비활성화 된 객체도 잘 활성화시키는 것을 확인할 수 있습니다.
'유니티에서 게임개발을 추구하면 안되는걸까' 카테고리의 다른 글
[Unity, C#] 모바일 UI 터치방지 (0) | 2021.06.02 |
---|---|
[Unity] GameObject 코드에서 생성 (0) | 2021.04.18 |
[Unity] Mathf.Lefp / 유니티 Lerp에 대하여 (0) | 2021.03.24 |
[Unity] Object.Instantiate 함수 (자동 world space좌표로 변환) (0) | 2021.03.21 |
[Unity] SetActive와 enabled (0) | 2021.03.05 |