🎮Unreal4/C++

[UE4] Arrow 생성/발사 : UProjectileMovementComponent, Attach/Detach

공대 컴린이 2023. 6. 17. 18:36
728x90

화살 발사를 위해 Projectile 클래스를 생성하고, 해당 클래스를 통한 화살을 생성해보았다.

🏹 Projectile 클래스 생성 : Arrow

Projectile 클래스에는 충돌 후의 생명주기를 설정할 LifeSpanAfterCollision 변수와, Capsule 컴포넌트, Projectile 컴포넌트가 있다. 

화살같은 객체를 만들기 위해선 Static Mesh도 필요한데, 이러한 부분은 Projectile 기반 블루프린트 클래스를 제작하여 커스텀하도록 따로 추가하지 않았다.

 

추가적으로, 프로젝타일이 충돌됐을 때 호출되는 FProjectileHit 델리게이트 수행이 끝나고 난 뒤 Destroy 처리를 위한 FProjectileEndPlay 델리게이트를 생성해주었다.

 

생성자에선 각 컴포넌트를 초기화 한 뒤, Projectile의 중력을 제거하고, Capsule 컴포넌트의 Collision을 켜고 Profile을 BlockAll로 설정하였다.

 

BeginPlay 함수에서는 Capule 컴포넌트의 Collision을 다시 꺼주어 Projectile 발사 객체 간의 밀림  현상을 방지하였다. 이후 Hit 델리게이트 함수를 등록하고, Projectile은 Active가 꺼진 DeActivate 상태로 시작하도록 설정하였다.

 

EndPlay 함수에서는 OnEndPlay 델리게이트에 등록된 함수를 모두 호출하였다. 해당 델리게이트는 Projectile 클래스에서 무조건적으로 함수를 등록해놓는 것이 아니라, 외부 클래스나 함수에서 필요로할 때 따로 등록하고 호출할 수 있도록 구현해놓은 것이다.

 

Projectile의 Shoot 함수가 호출되면 그제서야 Projectile의 Active를 활성화시키고, Collision도 켜주었다.

 

OnComponentHit 함수에서는 일정 시간뒤에 Projectile 객체가 소멸되도록 LifeTime을 설정하고, 충돌된 캐릭터들에게 연결된 OnHit 델리게이트 이벤트들을 호출시켜주었다.

 

컴파일 후 CProjectile 기반 블루프린트를 생성하여 Arrow 객체를 만들어주었다.

🏹 화살 발사 클래스 생성 : CDoAction_Bow

만들어진 화살 객체를 발사하기 위해 DoAction_Bow 클래스를 생성하였다.

 

DoAction_Bow 클래스에선 발사하고자 하는 화살 Class 변수를 선언하였고, Shoot 함수를 호출할 Begin_DoAction과, 화살을 손에 장착시키기 위한 OnBeginEquip 함수를 선언하였다.

 

또한 화살의 Hit와 화살의 Destroy를 DoAction_Bow 클래스에서 관리해주기 위해 OnArrowHit, OnArrowEndPlay 함수를 선언하여 구현하였다.

 

활을 쏘기 시작하는 Begin_DoAction 함수가 호출되면, GetAttachedArrow 함수를 통해 플레이어의 손에 붙어있는 화살 객체를 가져온다. 

손에 붙은 채로 화살이 발사될 수 없으므로 DetachFromActor 함수Character에서 화살을 분리한 뒤, Projectile의 Shoot 함수를 호출하여 발사하였다.

 

GetAttachedArrow 함수에서는 Bow가 가지고있는 Arrows 배열 목록에서 현재 플레이어에게 붙어있는 활을 찾아서 반환해주는 형식으로 구현하였다.

 

화살 발사가 끝나거나, 활을 처음 장착했을 때 손에 화살을 들고있을 수 있는 CreateArrow 함수를 호출해주었다.

 

CreateArrow 함수에서는 저장해두었던 Arrow Class를 이용하여 Projectile 객체를 생성하고, 캐릭터의 Mesh 중, 화살을 잡는 소켓(Hand_Bow_Right_Arrow)에 부착하였다.

이후, 캐릭터가 생성한 화살 배열(Arrows)에 추가하였다.

 

이때 화살을 스폰하고 난 뒤, 화살 객체에 대한 초기 설정이 이루어지고 실제 Spawn이 끝나도록 단계를 분리하기 위해 SpawnActorDeffered 함수FinishSpawningActor 함수를 사용하였다. (액터의 라이프사이클을 공부하면 어떻게 작동되는지에 대해 공부할 수 있다.)

 

컴파일 후 프로그램을 실행시켜보면 무기를 장착했을 때 화살이 생성되어 손에 잡히고, 화살을 발사하고 나서도 새로운 화살이 잘 생성되고, Shooting 되는것을 확인할 수 있었다.

(화살이 이상하게 날아가는건 다음에 수정해보도록 하자...)

 

728x90