초보 코린이의 성장 일지

UE4 FireBall 피격 및 Bow 장착, 발사 본문

언리얼

UE4 FireBall 피격 및 Bow 장착, 발사

코오린이 2023. 1. 31. 12:54

FireBall 스킬은 현재 발사만 되는 상태이므로 피격이 되도록 만들어 줄 것이다.

또 한 피격시 소멸되도록 조건을 넣어서 완성해보겠다.

 

커스텀 이벤트를 하나 생성해주고 날린다는 의미로 이름을 설정해준다. 어느 방향으로 날릴지를 판단해 줄 입력 파라미터를 추가해준다.

 

1. 추가한 컴포넌트 Projectile를 가져다가 안에있는 스피드를 불러준다 그리고 곱해주면 날아갈 방향이자 속도가된다.

2. 그다음 Projectile로 Velocity를 연결해 값을 셋팅해준다. 곧 날아갈 방향

3. 멈춘 상태에서 Shoot가 콜됐을때 Set Active를 수행하도록 연결해준다. (지정해주고 활성화 시키는 방법, 값을 변경할때 용의하다)

Weapon_FireBall로 이동

원래 만들었던 SpawnActor 뒤에 Vaild 체크 추가만 해줬다.

1. 생성되는 지점에서 혹시 생성이 안됐을수도 있으니 Valid로 체크해주고

2. 맞다면 Shoot 바로 콜해주고, Direction 할당해준다.

 

다시 Skill_FireBall로 돌아와서 Begin Overlap 작성

1. Other Actor과 Character이 같지 않다면 데미지를 주도록 조건문으로 연결

2. 타깃과 공격자가 누군지 연결

3. 피격 후 소멸

이제 전방방향으로 날아가면서 충돌하면 터지면서 소멸한다.

 

이제 활을 만들어 볼 것인데 어려운 내용이 될 것이다. 우선은 Weapon을 자손 블루프린트로 생성해준다.

생성해 주고 이름 변경 후 알맞은 폴더에 옮겨준다.

 

1. 컴포넌트 PoseableMesh 추가해준다.

2. 오른쪽 메시란에 들어가서 Bow Mesh 선택

 

이제 사용 뽑는 모션과 당기는 모션 애니메이션을 몽타주로 생성해서 2개 가져와 준다.

AR_DrawBow_Montage

 

AR_ShootAndDraw_Montage

둘다 UpperBody로 변경해주고, 알맞은 자리에 액션 이벤트를 넣어준다.

무기를 추가하는 것이므로, 전과 동일하게 엑셀표를 작성해 줘야한다.

DT_Equip_Bow

몽타주 뽑는 모션

DT_DoAction_Bow

몽타주 장전하고 쏘는 모션

알맞은 값으로 작성해주고, 몽타주 레퍼런스 복사 후 잘 넣어준다.

 

만든 엑셀을 알맞게 임포트해서 추가해준다.

Weapon_Bow로 와서 알맞은 테이블을 설정해준다.

Weapon_Component로 와서 함수 SetBowMode 추가 후 Type 설정해준다.

 

플레이어로 와서 7번 입력액션 Bow로 설정 후 Mode 변경이 되도록 연결해준다.

 

플레이어 애니메이션으로 온다. 이제부터 어려운 내용일수도 있다

 

이제 구역을 분활하기 위한 용도로 레이어를 활용할 것이다.

일단 사용할 레이어 2개를 추가해준다.

AnimGraph에서 옮기기 전

원래 AnimGraph에 있던 애니메이션들 상태를 짤라서 만들어준 애니메이션 레이어에 넣어 줄 것이다

LocomotionLayer로 옮긴 후
BowLayer

원래 쓰던 그대로 값 2개 대입해준다.

1. 만들어 준 레이어들을 2개 호출한다.

2. Weapon Type이 Bow가 같을때는 Ture가 플레이되고, 같지 않다면 False가 플레이 될 것이다.

애니메이션 작업은 끝이났고, 이제 구역이 나눠진 것이다.

 

Hand_L에 소켓을 추가해주고, 프리뷰 애셋으로 활을 추가해준다.

화살은 Hand_R에 소켓을 추가해주고, Hand_Bow_Right_Arrow라고 이름을 설정해준다.

 

우선 이제 화살을 날려야하기 때문에 한가지 해줘야 할게 있다.

Skill을 자손 블루프린트로 생성해준다. 이게 화살이 될 것이다

컴포넌트를 3개 추가해준다.

충돌체가 필요하므로 Sphere 추가

화살이 보여야하므로 StaticMesh 추가

날아가는게 필요하므로 ProjectileMovement 추가

수정 전
수정 후

여기서 중요한게 화살같은 충돌체가 정중앙에 있어 기준이 되고 Mesh가 보여지는것이다. 그래서 뒤로 땡겨서 맞춰줘야한다. 

커스텀이벤트 Shoot를 추가해준다.

이제 등장할때부터 활이 나갈때까지 코드를 구현해 볼 것이다.

 

1. 우선 등장을 시킨다 그리고 바로 등장 시킬게 아니므로 Set Collision Enabled을 No Collision 으로 꺼준다.

2. Shoot에는 입력 파라미터 InDirection을 받아준다.

3. Prohectile Movement에 Speed를 가져다가 곱해준다. 그리고 Velocity에 넣어준다.

4. Active로 날아가게끔 New Active 체크해준다.

5. 이제 날라가서 충돌해야 하므로 Sphere를 연결 

6. 5초동안 날아가도록 Lifr Span 값 5를 넣어준다. 그럼 호출되는 시점으로부터 5초뒤 사라진다.

 

Weapon_Bow로 와서 활이 등에 붙어서 나오고 장착버튼을 누르면 장착되도록 Socket을 지정해주고 활을 소환해준다.

이제 사용할 함수와 변수를 만들어준다. 장착이 완료 됐을때가 End_Equip에서 진행되는데. 거기까지 가는 과정이 복잡하므로 천천히 진행해보겠다.

DoAction

지난번에 만들 FireBall에 있는 Do_Action을 그대로 가져온 것이다. 똑같이 멀리 날리는 공격을 하기때문에 동일하다.

Begin_DoAction

화살이 날릴때 중요한게 있다. 그 날리는 화살이 과연 어떤 화살인가 날아가는 화살? 장전 중인 화살?

붙어있는 화살이 맞을것이다 근데 그걸 어떻게 찾을 것인지가 관건인데 그 방법은 Attach되어있는 화살을 찾으면된다.

 

1. 배열 Arrows로 새로운 for break를 사용해서 돌린다. break에 걸리면 completed로 나온다.

2. 화살이 Is Valid로 있는지 체크해주고 if로 넘겨준다.

3. Get Attach Parent Actor로 어딘가에 붙어있다면 그 Actor이 리턴된다. 그리고 Is Valid로 있다면 붙어있는 화살로 판단

4. 이제 붙어있는 화살을 날릴것이다. 그래서 로컬변수 Temp에다가 Array Element를 세팅해놓는다.

5. 날릴 화살을 하나 찾았으니 이제 수행하지 않을 것이므로 break에 연결해서 끝낸다.

6. 이제 break 걸렸으니 Completed로 나왔을텐데 또 Temp가 존재한다면 그걸 사용할 것이므로 Is Valid로 확인해준다.

7. 이제 화살은 붙어있는 상태이므로 때줘야한다 때주는 함수는 DetachFromActor을 사용하면 된다. Temp를 때준다.

8. Keep Relative 때면 상대간격을 유지하면서 때게 되는 것이다 하지만 우리는 월드로 때줘야 하므로 Keep World로 설정해준다.

9. 이제 화살을 땟으므로 Shoot로 날아가게 만들어준다.

10. 플레이어와 카메라에 Controller가 같으므로 전방 방향인 Forword로 방향을 이어준다. 

 

DetachFromActor 설정을 보면 상대간격을 고려해서 때냐 아님 그냥 때냐 설정할 수 있다. 캐릭터 위치에서 나가게 만들어야 하므로 월드위치에서 땔 수 있도록 설정해줘야한다.

 

CreateArrow

한개만 생성할게 아니기 때문에 배열로 생성해준다.

1. 화살은 등장한 시점부터 계속 존재해야하므로 Spawn에 있는 Collsion 설정을 Always Spawn으로 변경해준다.

2. 생성된걸 Arrow에 셋팅해주고 add로 배열로 만든 화살도 넣어준다.

 

End_DoAction

화살이 한번만 나가게 하는게 아닌 여러발을 계속 만들어서 발사해야 하기때문에 자동생성 하게 만들어 놓은 Create Arrow로 연결해준다.

End_Equip

활이 Static으로써 Mesh에 닿게 되면서 캐릭터가 활을 장전한 상태로 돌아다니면 움찔움찔하면서 모션이 이상해질때가 있다. 그래서 해결을 해줘야하는데 충돌체를 일시적으로 우선 꺼주는 방법이있다. 하지만 다른 작업도 해줘야 할 것이다.

 

https://www.youtube.com/watch?v=wfQiVjru_VQ 

- 활은 너무 어렵다

- 더 어려워 질 것이다

Comments