🎮Unreal4/C++

[UE4] Around 공격 : Character 주변을 회전하는 Object (Fire/Ice Ball, RotateAngleAxis)

공대 컴린이 2023. 6. 13. 10:52
728x90

Fire Ball이나 Ice Ball이 플레이어의 주변을 돌면서 Enemy를 공격하는 Around 무기를 제작해보았다.

📖 CDoAction_Around 클래스

먼저, Around라는 이름의 공격 클래스 CDoAction_Around를 제작하고, 플레이어 주변을 회전할 객체 CRotate_Object 클래스도 생성해주었다.

📖 CRotate_Object 클래스

CRotate_Object 클래스에는 Object에 충돌했을 때 캐릭터에게 들어갈 HitData와, 회전 속도(Speed), 플레이어로부터의 거리(Distance), 역방향으로 회전할 것인지(bNegative), 데미지 처리 간격(DamageInterval) 속성값이 존재하고, 

컴포넌트로는 Capsule ComponentParticle이 존재한다.

🚩 회전 객체 초기화

헤더파일의 생성자에선 각 컴포넌트와 속성값들에 대한 초기화를 진행하였다.

 

BeginPlay가 호출될 땐 회전 Object가 플레이어의 어느 각도에서 처음 생성될 것인지 Angle을 랜덤으로 구해주고, Capsule Component의 Overlap 충돌을 모두 델리게이트에 연결해주었다.

 

또한 충돌 시 일어날 연속 데미지의 간격을 SetTimer 함수로 지정해주었다.

 

타이머는 Rotate_Object 객체의 작동이 끝난 EndPlay 함수 호출 시 삭제해주었다.

🚩 회전 구현

Tick 함수에서는 플레이어나 다른 Owner Character의 주변을 계속 회전하도록 구현해주어야 한다.

현재 Owner의 Location을 받아오고, 역방향 회전인지를 판별하기 위한 bNegative 변수를 이용하여 Speed와 DeltaTime을 곱해 Angle을 점차 증가시키거나 감소시켜주었다.

 

이때 float 값인 Angle이 -360도나 360도에 거의 근접한지를 판별하여(IsNearlyEqual) 각도가 오버되지 않도록 0으로 초기화하며 연속적으로 진행한다.

 

OwnerCharacter 와의 간격은 X축으로만 Distance만큼 움직인 FVector를 생성하고, 해당 거리에서 RotateAngleAxis 함수를 통해 해당 FVector가 바라보는 방향에서  Angle만큼 회전된 방향 벡터를 구해낼 수 있다.

 

즉, Distance만큼 떨어진 거리에서 FVector::UpVector를 기준으로 Angle 각도만큼 회전된 방향 벡터를 구해서 FVector value 값에 저장한 것이다.

 

이렇게 회전된 방향벡터 value값을 지속적으로 플레이어의 위치 location에 더해준 뒤, Rotate_Object 객체의 위치를 초기화시켜주었다.

이때 객체의 방향은 Yaw값만 Angle만큼 회전된 방향으로 초기화해준다.

🚩 회전 객체 충돌처리

Rotate_Object 객체의 충돌처리는 BeginOverlap / EndOverlap 함수를 통해 구현하였고, Hitted 배열에 충돌된 Character 객체들을 저장하여 중복 데미지 처리를 방지하였다.

 

BeginPlay 함수에서 지속적인 DamageInterval 시간마다 SendDamage 함수가 호출되도록 SetTimer 를 설정해 놓았으므로 Hitted 배열에 들어오는 캐릭터들에게 SendDamage를 전달하게 된다.

 

CDoAction_Around 클래스에서는 공격이 시작되는 Begin_DoAction 함수 호출 시,  만들어진 CRotate_Object 액터를 Spawn하여 사용한다.

 

컴파일 후, CRotate_Object 클래스를 기반으로 블루프린트 클래스를 생성하고, 직렬화했던 속성값들을과 파티클을 각각 설정해주었다.

 

생성된 BP_CRotate_Object를 BP_CDoAction_Around 클래스의 Rotate Classes 배열에 추가해주면, Begin_DoAction 시 해당 배열에 들어간 클래스가 랜덤으로 Spawn 될 것이다.

 

전체적인 프로그램 컴파일 후 실행시킨 결과는 아래와 같다.

성공적으로 플레이어의 공격 시 Rotate_Object가 스폰되며 플레이어 주변을 회전하고, 해당 액터에 충돌된 Enemy Character들에게 데미지가 입혀지는 것을 볼 수 있다.

 


참조

https://wecandev.tistory.com/160

 

[언리얼 엔진] 벡터의 축 회전, 두 벡터 사이의 각

시작하며 게임을 개발하다보면 특정 방향을 기준으로 회전된 벡터값을 구하거나 두 개의 방향벡터 사이의 각을 구해야 할 경우가 있다. 예제 코드를 기록하여 기억해 두고자 한다. 예시 캐릭터

wecandev.tistory.com

728x90