본문 바로가기

Unity/Common

Unity - Destory in List<Component>. Desotry()에 대한 짧은 글

반응형

Destory()를 이용해 컴포넌트를 갖고있는 리스트의 인덱스를 파괴해야할 때 이런 생각이 든다.

1. 파괴 후 해당 인덱스는 그대로인가?

2. for문을 통해 특정 인덱스를  파괴 할 때 어찌해야하나?

 

이 글에선 정확한 매커니즘 까진 파악하지 않았지만 맥락적인 부분을 살펴보았다.

 

첫 번째, Destory는 하이어라키에 있는 오브젝트를 지우는 행위다.

 무슨 의미냐면 하이어라키에서의 삭제가 메모리에서의 삭제의 의미가 되진 않는다는 것이다. 물론 렌더링이나 스크립트 등에 의한 동작은 중단되지만, 기존의 정보는 유지되고 있음을 의미한다.

GameObject go = Instantiate<GameObject>(rect.gameObject);
Destroy(go);
Debug.Log(go);

간단히 생성후 지우고 로그를 찍는 것이다.

로그에 그대로 찍힌다.

두 번째, 유니티의 사용한 인스턴스 제거는 별도다.

 위에서 언급되었듯 destory는 하이어라키에서의 배제일 뿐 메모리를 릴리즈 하려면 아무레도 직접 제거를 해줘야 한다.

하지만 GC를 호출하여 가비지를 가져가도록 하면 너무 무겁다. 그래서 스크립터블오브젝트와 같은 유니티의 인스턴스는 다음과 같은 코드를 이용한다 한다.

 

Resources.UnloadUnusedAssets();

 

세 번째, 결론적으론 리스트의 내용물은 Destory한 것과 인덱스의 파괴여부는 별도다.

 어찌보면 당연한 것이지만 궁금해서 코드 적어보면서 체크했다.

 

        li = new List<GameObject>();
        for (int i = 0; i < 4; i++)
            li.Add(Instantiate<GameObject>(rect.gameObject));
        Debug.Log(li.Count + " - " + li[2].name);
        Destroy(li[2]);
        Debug.Log(li.Count + " - " + li[2].name);

위는 리스트를 생성후, 마지막에서 한칸 아래의 것을 삭제 후 로그를 체크한 것이다.

리스트의 길이도, 해당 인덱스의 내용물도 정상적으로 찍힌다. 다만 하이어라키에만 없을 뿐이다.

 

 

반응형