🎮Unreal4/Blueprint

[UE4] 콜리전 중복 충돌 문제, 공격 중 전방의 Target에게 카메라 고정/회전, 가장 전방에 있는 액터 찾기 함수 작성

공대 컴린이 2023. 2. 3. 01:37
728x90

💥 콜리전 중복 충돌 문제

Enemy를 공격할 때 Enemy에 존재하는 캡슐 콜리전에 플레이어의 무기가 여러번 충돌되는 문제가 발생하였다.

Component Begin Overlap 함수를 호출하여 충돌을 체크하는데 무기를 휘두르는 시간이 길다면 여러번 충돌이 체크될 수 있다.

 

따라서 이를 해결하기 위해 무기가 상속받는 Weapon_Combo 클래스에서 공격하는 대상들을 저장하는 Character형 배열 변수 Hitted를 생성하였다.

 

무기와 Overlap 충돌되는 Character 액터들을 모두 Hitted에 저장하는데, 이때 AddUnique 함수를 사용하여 중복되지 않는 캐릭터 액터들만 저장하는것이 핵심이다!

 

결과적으로 충돌되는 액터들을 중복없이 배열에 담기 때문에 여러번 충돌이 체크되어 공격하는 문제는 사라지게 된다.

🎥 공격 중 전방의 타겟에게 카메라 고정 -> 가장 전방에 있는 액터 찾기 함수 작성

플레이어가 Enemy를 공격할 때 위치나 방향이 잘 맞지않으면 콜리전 충돌이 빗겨가면서 공격 처리가 안되는 문제점이 종종 발생하였다. 따라서 플레이어가 공격 액션을 수행할 때 충돌 처리되는 Enemy들 중, 플레이어의 가장 전방에 위치한 Enemy에게 카메라를 회전시켜 콜리전이 빗나가지 않도록 하는 기능을 구현해보았다.

 

플레이어에게 타격된 액터는 위에서 구현한 내용과 같이 Hitted 배열에 저장 해 두었다.

 

블루프린트 함수 라이브러리 클래스 - F_Weapon

이제 문제는 어떤 액터가 플레이어의 전방에 있는가를 체크하는 것이다.

 

나는 액터의 위치에서 플레이어의 위치를 빼서 플레이어->액터 방향으로 가는 방향벡터를 구한 뒤, 단위 벡터로 만들기 위해 Normalize를 진행하였다.

 

이후 액터의 Forward값과 플레이어의 방향벡터를 내적하여 그 결과값(각도)가 가장 큰 값을 플레이어의 가장 전방에 있는 액터로 선별하였다.

이는 내적의 성질을 이용한 결과인데, 내적은 정면에 있을수록 1에 수렴하는 결과를 보이며 90도에 위치할 때 0의 값을 갖는다.

 

참고로, 내적의 각도 범위는 -90도부터 90도이다.

 

또한 위 클래스는 블루프린트 함수 라이브러리 클래스로 생성하여, 전역에서 함수를 호출하여 쓸 수 있도록 만들었다.

 

Weapon_Combo(무기 부모 클래스)의 Off Collision 함수

전방 액터를 찾는 함수를 전부 구현한 뒤, 무기 콜리전이 끝날 때 노티파이로 호출되는 Off Collision 함수에서 작성한 전방 함수를 호출하였다.

 

플레이어와 타격된 액터 배열을 함수로 넘겨주고 가장 전방에 있는 액터를 Character 자료형으로 반환받는다. 

이후 플레이어를 Enemy의 방향으로 바라볼 수 있도록 Find Look at Rotation 함수와 Make Rotator 함수를 사용해 방향을 전환해주었다.

(이때, Rotation을 바꿀때는 꼭 Z인 Yaw값만 회전시켜야 한다는것을 주의하자)

 

728x90