🗡️ 공격 시 충돌 처리
플레이어의 공격기능을 구현했으므로, 이러한 공격에 데미지를 입을 수 있는 충돌처리를 구현하였다.
충돌은 무기에 Collider를 추가한 뒤, Overlap Collision을 이용하였다.
🔻 제어할 Collision 객체 저장
무기의 Collider는 무기별로 가지는 종류와 개수가 모두 다르기때문에 어느 한 곳에서 관리하기 위해선 Attachment에서 관리하며 된다.
따라서 Attachment에 현재 무기가 가지고있는 모든 Collider를 저장할 TArray<class UShapeComponent*> Collisions; 를 선언해주었고, BeginPlay 호출 시 자식의 Collider를 불러와 추가해주었다.
이때, Box, Sphere, Capsule Collision 컴포넌트는 ShapeComponent라는 하나의 부모로 묶이기 때문에 배열의 자료형을 ShapeComponent로 설정하였다.
SceneComponent인 Root의 GetChildrenComponents 함수를 통해 자식의 모든 SceneComponent를 불러오고, ShapeComponent로 형변환 되는 객체만 추가해주었다.
모든 Collision에는 OnComponentOverlap 충돌함수가 호출될때 Attachment의 OnComponentOverlap 함수가 호출되도록 연결해두었다. 충돌에 대한 처리를 각 Collision 객체에서 수행하는 것이 아니라 Attachment에서 일괄 처리하기 위함이다.
이후 기본적으로 모든 콜리전을 Off 해두었다.
🔻 Collision의 On/Off
OnCollision과 OffCollision 함수에서는 각각 콜리전에 대한 CollisionEnabled를 설정해주었다.
이때 데미지를 입는 객체가 연속으로 Collision에 충돌되지 않도록, 한번 충돌되면 Collision을 꺼줘야 한다.
이러한 이벤트를 처리하기 위해 델리게이트를 추가해주었고, 델리게이트 객체에 대한 이벤트 호출을 OnCollision과 OffCollision의 각각에서 수행하여 Collision이 켜지고 꺼졌을 때 필요한 이벤트들이 작동되도록하였다.
이후, Collision 객체의 Overlap 충돌 시 호출될 수 있는 AttachmentBeginOverlap과 AttachmentEndOverlap 델리게이트를 추가하였다.
🔻 OnComponent Begin/End Overlap
Overlap 델리게이트들은 실제 OnComponentOverlap 함수가 호출될 때 Broadcast 하도록 작성하였다.
🔻 DoAction 클래스에 델리게이트 등록 함수 추가
Collision에 대한 충돌을 검사하고 처리하는 부분은 DoAction을 사용할때 즉, 공격 시 검사해야 하므로 DoAction 클래스에서 Attachment의 델리게이트에 등록할 함수들을 생성하였다.
DoAction 클래스는 부모클래스이기 때문에 DoAction을 상속받는 자식들마다 재정의하여 사용할 수 있도록 virtual 가상함수로 생성하였다.
🔻 DoAction_Combo 클래스 작성
DoAction을 상속받아 Sword의 콤보공격을 수행할 DoAction_Combo 클래스에서 두 개의 함수를 재정의하였다.
Combo 클래스의 BeginOverlap 함수에서는 데미지를 입힐 캐릭터를 Hitted 배열에 추가하였다.
이때 하나의 공격에 여러번 충돌되는 중복을 막기 위해 Hitted 배열안에 이미 캐릭터가 들어가있는지 확인하였고, AddUnique로 추가해주었다.
EndCollision에서는 충돌처리가 끝난 경우이므로 Hiited 배열을 비워준다.
🔻 WeaponAsset 에서 델리게이트 함수 등록
이러한 DoAction 클래스의 델리게이트 함수는 WeaponAsset 클래스에서 연결해주었다.
WeaponAsset 클래스의 BeginPlay 시 DoActionClass를 검사할 때 DoActionClass의 Attachment가 존재한다면, 함수를 연결해주었다.
🔻 Collision Notify State 생성
이후, Collision의 On/Off 타이밍을 설정하기 위한 Collision 노티파이 스테이트를 생성하였다.
Notify의 Begin과 End 함수에서 Attachment의 OnCollision 함수와 OffCollision 함수를 호출하였다.
이후, 만들어진 Collision 노티파이 스테이트를 공격 몽타주에서 충돌처리할 위치에 배치시켜주었다.
컴파일 후 프로그램을 실행시켜보면, 아래와 같이 Enemy가 Sword에 맞을 때 로그가 찍히는것을 확인할 수 있었다.
각 클래스간의 델리게이트함수를 호출하고 등록하는 과정이 복잡한 것 같아, 그림으로 정리해보았다,,
주먹과 발차기가 무기가 된 경우가 하나의 무기에 Collision이 여러 개이므로 예시로 들었다. (Sword는 콜리전 하나)