Loading the catalog…
Loading the catalog…
이 글은 개인 프로젝트 'Dungeon Adventure'을 만들며 겪은 이슈 기록입니다. Dungeon Adventure [Github] 문제 상황 게임을 재시작하면 던전은 새로 생성되지만, 이전 판의 몬스터, 드랍 아이템, 날아가던 투사체가 그대로 남아 있음 원인 확인 재시작할 때 호출되는 ClearDungeon()은 던전이 직접 생성한 오브젝트(방 콜라이더, 문, 장식, 타일)만 정리하고 있었음 // 수정 전 private void ClearDungeon() { foreach (RoomRuntimeData data in runData.Values) { // 방 콜라이더 제거 Destroy(data.roomObject); // 문 각각 제거 foreach (var door in data.doors) { Destroy(door); } foreach (var decoration in data.decorations) { Destroy(decoration); } } // 타일맵 제거 tilemap.ClearAllTiles(); // RunData 제거 runData.Clear(); } 하지만 몬스터, 드랍 아이템, 투사체는 다른 시스템이 오브젝트 풀에서 꺼낸 것이라 정리 대상에서 빠져 있었음 오브젝트 생성 주체 수정 전 정리 여부 방 / 문 / 장식 / 타일 DungeonRenderer O 드랍 아이템 DropSpawner (풀) X 몬스터 MonsterSpawner (풀) X(목록은 있었으나 정리 안 함) 투사체 공격 로직 (풀) X → 누가 오브젝트를 정리할 책임이 있는지 정해져 있지 않은 상황 해결 1. 몬스터: 이미 있던 목록 활용 방별로 관리하던 spawnedMonsters를 순회하며 풀에 반납 2. 드랍 아이템 / 투사체: 오브젝트가 스스로 등록 생성한 쪽이 목록을 관리하는 대신, 오브젝트가 활성화/비활성화될 때 스스로 목록에 등록하고 해제하도록 변경 public static readonly List<Projectile> Active = new List<Projectile>(); private void OnEnable() { // (기존 초기화 코드 생략) Active.Add(this); // 풀에서 꺼내지면 등록 } private void OnDisable() { Active.Remove(this); // 풀에 반납되면 해제 } DroppedItem도 같은 방식으로 적용 3. ClearDungeon()에서 일괄 반납 // 수정 후 private void ClearDungeon() { // 드랍된 아이템 전부 제거 foreach (var item in new List<DroppedItem>(DroppedItem.Active)) { ObjectPoolManager.Instance.Release<DroppedItem>(item.SourcePrefab, item); } // 투사체 전부 제거 foreach (var projectile in new List<Projectile>(Projectile.Active)) { ObjectPoolManager.Instance.Release<Projectile>(projectile.SourcePrefab, projectile); } foreach (RoomRuntimeData data in runData.Values) { // 몬스터 제거 foreach (Monster monster in data.spawnedMonsters) { monster.spawner.ReleaseMonster(monster.sourcePrefab, monster); } Destroy(data.roomObject); foreach (var door in data.doors) Destroy(door); foreach (var decoration in data.decorations) Destroy(decoration); } tilemap.ClearAllTiles(); runData.Clear(); } 복사본을 순회하는 이유 풀에 반납하면 SetActive(false) → OnDisable()이 즉시 호출되어 Active에서 자신을 제거하는데 원본 리스트를 그대로 foreach로 돌면 순회 중에 리스트가 바뀌어 InvalidOperationException이 발생하게됨 따라서 new List<>(Active)로 복사본을 만들어 순회 결과 재시작 후 이전 판의 오브젝트가 남지 않음. 아쉬운 점 및 배운 점 오브젝트를 만드는 쪽과 정리하는 쪽이 다르면, 정리하는 쪽이 목록을 알 방법이 필요하다. 결과적으로 정리 누락은 해결했지만 던전을 그리는 역할인 DungeonRenderer가 투사체와 드랍 아이템의 정리까지 맡게 되었다. 원인으로 짚었던 정리 책임 문제를 해결했다기보다는 책임을 한곳에 몰아넣은 셈이다. 프로젝트에서 이미 SO 이벤트 채널을 쓰고 있는데 재시작 이벤트를 발행하면 각 Spawner가 자신이 만든 오브젝트를 스스로 반납하는 구조가 더 적절할 것 같다는 생각이 들었다. 이렇게 하면 DungeonRenderer는 던전 오브젝트만 정리하고 새로운 풀링 오브젝트가 추가되어도 DungeonRenderer를 수정할 필요가 없다. 추후 리팩토링에 해당 부분을 반영해야 할 것으로 보인다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
[Unity/C#] 오브젝트 풀링 사용 시 재시작 정리 누락 이슈. 이 글은 개인 프로젝트 'Dungeon Adventure'을 만들며 겪은 이슈 기록입니다. Dungeon Adventure [Github] 문제 상황 게임을 재시작하면 던전은 새로 생성되지만, 이전 판의 몬스터, 드랍 아이템, 날아가던 투사체가 그대로 남아 있음 원인 확인 재시작할 때 호출되는 ClearDungeon()은 던전이 직접 생성한 오브젝트(방 콜라이더, 문, 장식, 타일)만 정리하고 있었음 // 수정 전 private void ClearDungeon() { foreach (RoomRuntimeData data in runData.Values) { // 방 콜라이더 제거 Destroy(data.roomObject); // 문 각각…
Open source