내일배움캠프 Unity 38일차 TIL - 팀 팀노션원본 - 개발일지

Wooooo·2023년 12월 20일
0

내일배움캠프Unity

목록 보기
40/94

[트러블 슈팅]

몬스터를 Spawn할 때 제네릭으로 컴포넌트 추가 중.
DeSpawn 이후 다른 몬스터 타입으로 다시 Spawn할 때, 다른 컴포넌트가 추가되는 상황 (ex. 근접몬스터 디스폰 후 원거리몬스터 스폰 시 2개의 컴포넌트를 가지게 됨)

즉, 오브젝트 풀에서 몬스터를 꺼내올 때 기존의 몬스터 컴포넌트를 제거하고 새롭게 스폰될 몬스터의 컴포넌트로 교체하는 작업이 필요했다.

방법 1)

Monster.OnDisable에서 Destroy(this) <- 위의 상황은 해결됐지만, DeSpawn 이후 같은 몬스터 타입으로 다시 Spawn할 때, 컴포넌트가 아예 사라지는 문제 발생

방법 2)

ObjectManager.DeSpawn()에서 Destroy(monster) <- 위와 똑같이 동작 중.

이유 : Destroy()는 파괴를 한 개의 프레임이 모두 끝날 때까지 대기 후, 다음 프레임의 렌더링 직전에 파괴를 수행함.
GetOrAddComponent를 이용하기 때문에 기존에 있던 컴포넌트와 새로 추가할 컴포넌트가 같다면, 추가되지 않고 삭제만 진행됨.
따라서 한 개의 프레임에서 Spawn 후 바로 DeSpawn하고 다시 Spawn하도록 테스트 코드를 짠 내 코드에서는 정상적으로 Spawn된 뒤 컴포넌트가 사라지는 문제가 발생

방법 3)

그래서 DestroyImmediate() 사용해봤더니, MissingComponent Error 발생 << +위험한 메서드라서 사용하지 않기로 함

방법 4)

SpawnMonster 메서드를 따로 작성하고, 몬스터의 스폰은 이 메서드를 이용한다.

[기존 동작 방식]

  1. 디스폰 시 기존의 몬스터 컴포넌트 Destroy하여 다음 프레임 전에 컴포넌트의 파괴가 예약됨
  2. GetOrAddComponent로 컴포넌트를 받아오거나 추가함
    같은 몬스터타입 컴포넌트로 Spawn시, 새로운 컴포넌트가 추가되는게 아니라 다음 프레임에 파괴될 예정인 컴포넌트를 참조하게 됨
  3. 몬스터 컴포넌트를 초기화
  4. 예정됐던 파괴가 진행되고, 컴포넌트가 사라짐

[해결한 메서드의 동작 방식]

  1. 스폰 시점에서 기존의 몬스터 컴포넌트를 Destroy
  2. 새로운 컴포넌트를 추가 후 초기화
profile
game developer

0개의 댓글