반응형
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);
위는 리스트를 생성후, 마지막에서 한칸 아래의 것을 삭제 후 로그를 체크한 것이다.
리스트의 길이도, 해당 인덱스의 내용물도 정상적으로 찍힌다. 다만 하이어라키에만 없을 뿐이다.
반응형
'Unity > Common' 카테고리의 다른 글
Unity Scripting - can only be called on an active agent that has been placed on a NavMesh. (0) | 2019.11.13 |
---|---|
Unity(C#) 업캐스팅 후 베이스 클래스 판별하다가 생긴 오류 (0) | 2019.10.15 |
Run Python on Unity, .Net - IronPython (0) | 2019.03.01 |
Navmesh Bake 시 주의사항 (Mulit Scene) (0) | 2018.05.02 |