문제 상황
Overlap 이벤트로만 데미지 처리를 구현했는데, 나중에 Bullet이 많아지면 성능이 떨어질 것 같아서 엔진에서 제공하는 기능으로 데미지 처리를 구현해보고 싶었다.
아직은 잘 모르지만 raycast가 overlap보다 더 적은 리소스를 사용한다고 해서 추후 raycast랑 용이하게 연결하기 위해서라도 엔진 자체 데미지 처리 기능을 사용해보려고 했다.
기능 이해와 테스트
엔진에서 Apply Damage와 Take Damage라는 기능을 제공한다고 한다. 기존의 Overlap 방식과의 차이는 다음과 같다.
Overlap 방식은 겹침이 발생했을 때에만 데미지를 가할 수 있지만, Apply Damage는 겹침이 발생하지 않아도 원하는 시점에 데미지를 가할 수 있다.
이에 일단 Overlap이 되면 Apply Damage를 실행시키는 방식으로 데미지 처리를 구현했다.
정상적으로 잘 동작한다. 사실 Any Damage 쪽은 On Take Any Damage라는 이벤트를 통해 구현하는 것도 되는데 일단은 Enemy 안에서만 데미지를 처리할 거라 Any Damage를 사용했다. Any Damage와 On Take Any Damage의 차이는 아래와 같다.
On Take Any Damage는 데미지를 받는 액터가 아니더라도 이벤트 디스패처를 통해 다른 액터 혹은 컴포넌트에서 이벤트를 바인딩할 수 있다.
데미지를 직접 받는 Enemy 액터가 아니더라도, 따로 데미지를 관리하는 액터나 데미지를 처리하는 컴포넌트를 만들어 그곳에서 처리할 수 있다는 말이다. 만약 이를 구현한다면 아래와 같다. (BP를 구현한다고 표현하는게 맞는지 모르겠다. 구현? 구성?)
추가로, 데미지 처리를 알아보면서 겸사겸사 콜리전 채널에 대해서도 알아봤다.
모든 콜리전은 하나의 콜리전 채널을 가지며, 각 콜리전 채널은 설정에 따라 아래의 기능을 한다.
- Query : Overlap, Hit 등의 겹침이나 충돌을 검출하고 관련된 이벤트를 호출하는 기능
- Physics : 물리적인 시뮬레이션 기능
- Query and Physics : Query와 Physics의 기능을 모두 수행 (당연히 계산량은 더 많아짐.)
그리고, 각 콜리전 채널은 채널끼리의 반응 관계를 정의해야 하는데 반응 관계의 종류는 아래와 같다.
- Ignore : 충돌을 무시한다.
- Overlap : 충돌은 무시하는데, 겹쳤을 때 이벤트를 발생시킨다.
- Block : 충돌을 발생시킨다.
언리얼에는 기본적인 콜리전 채널들이 프리셋(preset)으로 설정이 돼있는데 한번 확인해 봐도 좋을 것 같다. 오늘은 '이런 게 있구나~' 정도로 넘어가도 좋을 듯!
결과
아래처럼 Bullet 오브젝트랑 overlap 되면 Enemy 오브젝트에서 데미지를 받게 된다.
배운 점
- 내가 개발할 게임에 어떤 유형의 오브젝트들이 있고, 해당 오브젝트들이 서로 어떤 관계를 갖는지 정의하자. (콜리전 채널 설계를 위해서!)
더 알아볼 것들
- Overlap 시 이벤트가 한 번만 일어나는 게 아니라 여러 번 중복해서 일어나기도 해서 이 부분 처리 알아봐야 될 듯.
OnHit으로 해보려고 했는데 그럼 아예 콜리전 채널 관계를 block으로 해야 되는 것 같다. 추후에 관통이 가능하게도 구현해보고 싶어서 다른 방법을 알아봐야 될 듯!
참고 링크
'개발 > 언리얼' 카테고리의 다른 글
[Blueprint] Enhanced Input Action (0) | 2023.12.30 |
---|---|
[Blueprint] Projectile Movement (0) | 2023.12.27 |
[Blueprint] 기묘한 For Loop와 Delay의 관계 (0) | 2023.12.24 |
[RYU Russell, 언리얼 엔진 중급 클래스] 배운 내용 정리 (4) [完] (1) | 2022.08.16 |
[RYU Russell, 언리얼 엔진 중급 클래스] 배운 내용 정리 (3) (0) | 2022.08.03 |