프로그래밍 공부
작성일
2024. 1. 30. 15:13
작성자
WDmil
728x90

언리얼 내에서 피격처리를 좀더 객관화 하여, 추가적인 행동을 취해보자.

피격 시 애니메이션을 송출할 것이다.

우선, 피격 애니메이션을 정의할 몽타주를 새로 생성한다.


몽타주 생성

위와같이, Hit모션에 따른 몽타주를 새로 정의한다.

사망모션과 Hit모션을 둘다 만들어준다.

몽타주 제작

몽타주는 각각 Hit은 상체 또는 전신으로 동작하고,

Dead는 전신으로 동작한다. 각 몽타주의 슬롯을 필요에 따라 원하는 위치에 정의해준다.

 

몽타주를 만들었으면, 이제 ABP에서 BP작업을 진행해준다.


ABP연결하기

ABP_Enemy로 이동한다.

이미 전에 ABP_Player에서 했던대로, 새롭게 연결하여 정의해준다.

기본 애니메이션은, BS_SwordEnemy를 통해 재생되고, 해당 애니메이션을 기준으로, UpperBody, 그 이후 FullBody로 연결되며 재생된다.

 

Fullbody가 마지막에 검사하는 이유는, 덮어씌워지는 객체의 결과값이 항상 가장 큰 쪽으로 이동해야 하기 때문.

기본애니메이션 -> 부분 -> 전체 순으로 연결되어야 자연스럽다.

만약, 위와같은 형태가 아니라면, bool변수나  상태머신을 통해 제어해주지 않았을 때, 애니메이션이 꼬일 수 있다.


데미지 노드 정의

 

이제, 공격받았을 때의 이벤트로 이동하여 추가할 이벤트들을 연결해보자.

우리가 연결하여 사용할 데이터는 위와같다. Color를 변경하고, 변경 이후에 DIe애니메이션을 체크한 뒤

죽지 않았을 경우, Hitted노드를 실행할 것 이다.


Die 노드

기본구조는 위와 같다.

먼저, HP가 0보다 작거나 같은지 확인하고, 참일 경우, Do Once를 통해 한번만 재생되도록 해준 뒤, Bool변수로 Dead에 체크하고, 죽었을 경우, 충돌처리가 진행되면 안되기 때문에, 충돌관련 타입변수를 NoCollision으로 바꾸어준다.

 

그 이후에 PlayAnimMontage를 통해, 내가 정의한 죽음 애니메이션을 재생해주면 된다.

 

여기서, 죽음 애니메이션 이후에 객체를 삭제처리 해주는 함수를 정의해 주어도 된다.

PlayAnimMontage이후에 Delay를 통해, 삭제처리까지 걸리는 시간을 바꾸어 주어도 되고,

전에 만들었던 Montage에 노티파이를 추가하는 방식으로, 노티파이로 지정된 함수를 재생해주어도 된다.

그 어떤 방식으로 정의하든, DieEvent를 실행해주는 결과만 같으면 된다.

현재 작성자는 노티파이를 통해 애니메이션의 실행위치에서 발신을 받아 실행하게 만들었다.

노티파이 정의

죽음처리는 매우 다양하게 이루어질 수 있으니, 현재 프레임워크나 작업방식에 맞는 형태를 띄는것 이 좋다.


테스트

 


Hit모션 만들기

 

이제 사망하지 않았을 때, Hit 애니메이션이 실행되도록 해보자.

Hit 애니메이션은 사망하지 않았을 때 동작함으로, 사망의 False를 NextNode로 연결할 수있도록, 출력에 연결해준다.

BP_Enemy의 Die노드

위 노드에서 False로 출력이 나가면 밖에서도 사용할 수 있게 된다.

 

Hit을 구성해보자.

 

우선, 공격을 맞았을 때, Hit애니메이션을 재생할 것 이다. Hit 애니메이션이 재생되고, 맞은 객체는 자신의 뒤쪽으로 밀려나게 한다.

 

맞은 객체의 뒤로 밀려나게 해도 되고, 공격한 객체의 Forword방향으로 밀어도 된다.

애니메이션 재생

몽타주는 Play Anim Montage를 통해 재생시킨다. 몽타주를 재생하고 피격객체를 뒤로 밀어주어야 한다.

AddActorWorldOffset을 통해, World상의 위치를 더해주어 뒤로 밀려나게 해준다.

Delta Location는, 더해지는 방향을 의미한다.

더해지는 방향은 위와 같다. 캡슐의 앞부분을 가져와서 2D방향으로 Normalzie해주고, Mesh의 중량값을 가져와서 -0.2만큼 곱해주면, 뒤방향으로 중량의 0.2만큼 밀리게 된다.


테스트


위와같이 bool변수를 통해 피격여부를 제한할 수 있지만, 다르게 플로우 컨트롤 을 통해 더 깔끔하게 정리할 수도 있다.

현 객체의 스테이트를 정의하고, 플로우컨트롤을 통해 행동을 제어하는 방식이다.

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/Blueprints/UserGuide/FlowControl/

 

흐름 제어

조건에 따라 실행 흐름을 제어할 수 있는 노드입니다.

docs.unrealengine.com

 

728x90