🎮Unreal4/Blueprint

[UE4] Around Attack 기능(FireBall, IceBall), Rotate Vector Around Axis

공대 컴린이 2023. 2. 6. 18:59
728x90

🔥 Around Attack 기능

마법사의 공격 기능 중 플레이어의 주위(Around)를 원형으로 돌면서 FireBall 또는 IceBall을 띄워 공격하는 기능을 만들어보았다.

❄️ Ball의 회전

Skill Around BP-1

Tick 이벤트를 호출하여 플레이어 주면을 회전하는 Ball의 각도를 계속 증가시켜주었다. 방향의 음값을 가리키는 Negative(bool형) 변수가 False이면 시계방향으로 회전하고, True이면 반시계방향으로 회전하도록 구현하였다.

Tick 호출마다 Speed 변수에 Deta Time을 곱하고 Angle값을 더하여 매 프레임마다 각도가 더해지거나, 음의 값이라면 감산되도록 구현하였다.

지속적인 각도 증가/증감 시 유의사항

Skill Around BP-2

앵글을 계속 감산/가산하며 시간이 지나면 각도가 360도 혹은 -360도를 지나는 순간이 온다.

 

이때 언리얼에서 360도와 720는 같은 각도로 판단하는가?

아니다. 360도로 두 각을 나누면 360도는 1의 값을 가지고, 720도는 2의 값을 가져서 두 각을 다른 각으로 취급해야 한다.

 

회전 각도를 사용할 때 각속도를 사용할것이 아니라면, 즉, 점점 회전이 빨라지도록 구현할것이 아니라면 각도는 반드시 360도로 제한해야 한다. (음수도 마찬가지로 -360도로 제한해야 한다.)

 

https://ko.wikipedia.org/wiki/%EC%A7%90%EB%B2%8C

 

각도가 계속 늘어나는 경우 또 다른 문제는, 축에 대한 회전값(축값)으로 각도를 쓰게되면, 축에 같이 초기화되는 x와 y의 축이 어떤 축이 몇도를 가지는지를 구분하기 어려워진다.

 

짐벌락

이는 곧 짐벌락 현상을 야기하기 때문에 각도를 지속적으로 증가시킬 때 한계치를 정해두는것이 좋다.

❄️ Rotate Vector Around Axis 함수

입력받는 벡터 A를 Axis 중심으로 입력받는 각도(AngleDeg)만큼 회전시킨 결과를 반환한다.

지금 구현하는것처럼 마법볼이 플레이어 중심을 회전한다거나, 몬스터가 플레이어 주변을 도는 기능 등을 구현할 때 자주 사용된다.

 

마법볼은 Particle System으로 구현했는데 이 마법볼이 회전할때의 각도를 Rotation으로 설정하여 Particle의 방향이 정상적으로 나올 수 있게 했다.

 

이때 Negative변수의 값이 True여서 마법볼이 반시계방향으로 회전하면 z축이 반전되어있는것처럼 보이기 때문에 블루프린트 클래스가 실행될 때 Negative 변수값에 따라 z축을 반전시킬지 아닐지 미리 연산하고 Relative Rotation을 설정해주었다. 이처럼 Set Relative Rotation 함수는 프로그램의 초기 방향을 설정하는 데 유용하게 사용된다.

 

이후에는 마법볼이 계속 플레이어의 정면에서만 동일하게 생성되지 않고 랜덤 방향에서 생성되게 만들기 위해 Random 방향값을 부여하였다.

 

마지막으로 회전되는 마법볼에 Enemy가 충돌하는 경우 데미지 처리를 구현하였다.

💥 충돌 시 지속적인 Damage 처리

마법볼의 데미지는 충돌 시 한번만 처리하는 방식이 아닌, 충돌중 계속해서 데미지를 입히는 방식으로 구현하였다.

 

Overlap 충돌이 Begin 호출되는 순간 충돌되는 오브젝트를 중복없이 리스트에 담아두었다가, End호출 되기전까지 데미지를 입히도록 하였다.

Begin Play 이벤트에서 0.1초마다 Damage 함수를 호출하도록 Set Timer by Event함수를 Looping으로 호출했기 때문에 해당 객체가 소멸될때까지 객체는 0.1초마다 데미지 처리를 체크한다.

 

따라서 Damage 커스텀 이벤트가 호출될때마다 마법볼에 충돌한 객체가 담겨있는 Hitted 배열을 검사하며 지속적인 데미지를 가한다.

 

마법볼의 블루프린트 클래스에서 Self 객체의 디테일 패널 속 Actor Lift Span을 5초로 설정해두었기 때문에 해당 객체는 스폰되고 5초후에 사라지게 된다.

 

최종 완성 화면

최종적으로 마법사 캐릭터의 마법볼 스킬기능 구현을 완료하였다.

728x90