Player의 Capsule 컴포넌트 뿐만 아니라 Mesh 컴포넌트 또한 콜리전이 있기에, 먼저 오브젝트와 충돌이 일어나는 쪽이
충돌 검사가 일어나게 된다.
만약 Root 컴포넌트가 충돌을 감지할 수 없는 컴포넌트라면, 이하의 자식 컴포넌트들도 모두 충돌 검사를 할 수 없다.
Tick 이벤트는 가능하면 많이 안쓰는 것이 좋다. 여러 곳에서 쓰면 쓸수록 프레임이 도는 시간이 오래걸리기 때문이다.
- Tick Interval : Tick 이벤트의 반복 간격
- Allow Tick Before Begin Play : BeginPlay 이벤트 호출되기 이전에 Tick 이벤트 발생 여부
콜리전 설정
만약 콜리전 프리셋에서 원하는 것이 없다면 Custom을 선택하여 직접 수정이 가능하다.
- Collision Enabled : 활성화된 콜리전의 유형
- Object Type : 단순 구분용으로 만들어놓은 오브젝트 유형의 열거형이다.
(static이라고 아예 못움직이는 것도 아니고 Dynamic이라고 무조건 움직이는 것도 아님)
※ 콜리전 프리셋 / Object Type 만들기
만약 원하는 프리셋이 없어서 Custom을 사용했지만, 해당 Custom을 사용할 모든 오브젝트들을 일일이 수정해야하는
번거로움이 있을 수 있다. 따라서 우리가 직접 콜리전 프리셋, Object Type을 만들어두고 사용할 수 있다.
편집 - 프로젝트 세팅 - 엔진 / 콜리전 탭에서 원하는 프리셋 또는 열거형을 만들어줄 수 있다.
- 새 오브젝트 채널을 통해서 새로운 ObjectType 열거형을 만들고, 기본 반응은 충돌 시 반응할 초기값을 말한다.
- 새 프로파일을 통해서 새로운 콜리전 프리셋을 만들어줄 수 있다.(프리셋 == 프로파일)
Weapon에서 충돌 판정 구현해보기
우리가 BP_Weapon을 만들었을 때 근접 무기만을 사용할 것을 생각하고 추상화한 클래스이다.
따라서 무기를 교체해도 근접 무기 특성 상 충돌 판정은 하나로 통일시킬 수 있다.
지금까지 배운 충돌 판정(Hit, Overlap, 무시)들 중에서 Overlap을 사용할 것이다.
따라서 BP_Weapon에 오버라이드 가능한 함수들 중에서 ActorBeginOverlap 이벤트를 사용하게 된다.
ActorBeginOverlap에서 입력받은 Actor를 Character로 형변환하면서 Life 체력을 불러와 Damage만큼 빼주는 로직을 구현
하면 되지만, 이미 언리얼엔진에 Apply Damage 함수로 구현되어 있다.
Apply Damage
Apply Damage 위의 데스크탑 모양의 아이콘은 서버에서 실행된다는 것을 뜻한다.
(서버가 없으면 그냥 로컬 환경에서 실행된다)
- Damaged Actor : 데미지를 받을 Actor
- Base Damage : 가해질 Damage
- Event Instigator(최종 책임자) : Damage을 가한 어떤 플레이어(Controller)
- Damage Causer(피해 유발자) : 실제로 Damage를 가한 Actor
- Damage Type Class : 피해 유형(화속성, 수속성, 관통 등등). 클래스 레퍼런스 타입(형식 정보 자체가 넘어감)
Damage Type Class
우리가 직접 Damage Type Class를 정의하여 각각 공격에 다르게 적용시켜줄 수 있다.
블루프린트 클래스 - DamageType 선택 후 생성할 수 있다.
이렇게 만든 DamageType 클래스를 보면 오버라이드 가능한 함수, 변수도 없고 클래스 디테일도 딱히 없는 깡통이다.
클래스 디폴트
- Caused by World : 지형(월드)에 대한 대미지인지 여부
AnyDamage 이벤트
이제 이렇게 Apply Damage로 적용시킨 뒤, BP_Character에서 오버라이드되는 함수 AnyDamage 이벤트 함수를 통해서
대미지를 가져올 수 있다.
AnyDamage 이벤트는 이 액터가 어떠한 형태로든 대미지를 받으면 이벤트를 발생시켜준다.
Apply Damage에서 보낸 Damage(대미지), Instigated(Player), Damage Causer(무기 액터)들이 입력되는 것을 볼 수 있다.
그런데 여기서 Damage Type은 Damage Type 오브젝트 레퍼런스로 입력이 된다.
Damage Type 클래스로 넘겼는데 오브젝트로 인스턴스 생성이 되서 넘어온 것으로 볼 수 있다.
문제는 Damage Type 클래스가 많을 땐데, 이는 AnyDamage 이벤트로 받아온 Damage Type이 여러 개 중에서 무엇인지 알 수 없다는 것이다.
이를 해결하기 위해선 Damage Type을 만들어 둔 클래스 하나하나 형변환을 시도해서 맞을 때까지 하는 방법도 있고,
Damage Type 밑으로 모든 대미지들을 서술할 수 있는 하나의 클래스를 생성하는 방법도 있다.
'언리얼엔진' 카테고리의 다른 글
28. 세트 컨테이너 / 시퀀스 노드 / 공격 시 충돌 수정 (0) | 2023.06.13 |
---|---|
27. 충돌판정 수정하기 / AnimNotifyState (2) | 2023.06.11 |
25. Hit / Physics Simulation / Delta Seconds (0) | 2023.06.07 |
24. 머티리얼 / Construction Script / Overlap (0) | 2023.06.06 |
23. 블렌드 스페이스(8방향) / Calculate Direction (0) | 2023.06.01 |