1. 개요
Projectile의 lifeTime에 따라 해당 시간이 지나면 알아서 파괴되게끔 설정하는 Despawn코드를 적용해 주었는데, 코루틴의 시간이 지나도 사라지지 않는 버그가 발생하였다.
그래서 디버깅을 해봤더니 T 제네릭이 ProjectileController의 부모 클래스인 SkillController로 해석되는 현상이 발생했다.
아래는 ObjectManger의 Despawn 메서드 중 if문에서 type이 SkillController가 들어오는 모습이고, 타고 올라가보면 StartDestroy() 함수에서 왔는데 이는 ProjectileController에서 상속을 받아 사용하고 있는 모습이다.
2. 문제 해결
생각보다 간단하게 해결되었다 typeof(T)를 사용하니 상속 클래스를 가져왔지만, GetType()함수를 사용하니 이 문제가 해결되어 ProjectileController를 잘 가져오게 되었다.
그렇다면 왜 typeof(T)는 부모 클래스인 SkillController를 가져오고 GetType()은 호출된 클래스를 가져오는 것일까?
3. typeof(T) 와 GetType()의 차이점
typeof(T)
- typeof(T)는 컴파일 타임에 결정이 된다.
- 인자로 Type 그 자체를 받아서 인자의 표시된 타입을 반환한다.
- 상속관계에서 부모 클래스로 처리될 수 있다.
GetType()
- GetType()은 런타임에 결정된다.
- 실체 객체의 타입을 반환한다.
- 항상 실제 객체의 타입을 반환하기 때문에 호출된 부분의 클래스를 반환한다.
SkillController에서 상속받은 Projectile이 SkillController내에있는 코루틴을 호출하여 사용하고 있기 때문에 Despawn을 Skillcontroller쪽에서 하다 보니 typeof(T)가 부모 클래스를 인식하여 이를 호출하여 생기는 문제인거 같다. 상속된 객체의 타입을 가져와서 해결할 때 위와 같은 사항을 주의하도록 하자
'Unity' 카테고리의 다른 글
[Unity] CSV 파일 적용하기 (1) | 2024.12.11 |
---|---|
[Unity] Mathf.Clamp를 이용한 슬로우 적용 (0) | 2024.11.26 |
[Unity] Sprite Atlas 및 스프라이트 동적 변화 (0) | 2024.11.25 |
[Unity] EventSystem.current.IsPointerOverGameObject() (0) | 2024.11.20 |
[Unity] Pooling에서 Queue와 Stack 의 선택 (지시어 사용) (0) | 2024.11.19 |