본문 바로가기
언리얼 블루프린트/컴포넌트

[언리얼5 블루프린트] 캐릭터의 공격 컴포넌트 만들기

by 디버그러 2024. 7. 9.

이전 게시물에서 인식과 추적 컴포넌트로 만들었습니다.

이제 공격하는 컴포넌트를 만들어보겠습니다.

 

 

새로운 블루프린트 클래스 캐릭터를 만들었습니다.

유저로 이름 변경했습니다.

 

폰이 아닌 캐릭터로 고른 이유는 복잡한 움직임(걷기, 점프 등)을 수행해야 하기 때문입니다.

 

 

Custom Event 노드와 Play Montage 노드를 추가했습니다.

공격으로 이름 변경하고 Mesh Component는 패널에서 메시를 가져와 연결했습니다.

Montage to Play는 Custom Event 노드와 바로 연결하면 핀이 생성됩니다.

 

 

예전에 만든 캐릭터의 블루프린트에 들어갑니다.

파일 → 블루프린트 부모변경 → 유저로 변경

만든 캐릭터들은 모두 부모변경을 해줍니다.

 

유저 클래스에 공격 이벤트에 대한 몽타주와 트레이스, 데미지를 설정하고,

공격 컴포넌트에 인식한 플레이어에 대한 공격 이벤트 실행을 넣을 예정입니다.

 

부모 클래스에 공격 이벤트를 설정하면, 모든 자식 클래스에서 동일한 공격 로직을 공유할 수 있어 효율적입니다.

 

 

다시 유저 클래스로 돌아가서 새 함수를 만들었습니다.

공격할수있는가? 로 이름 변경했습니다.

 

 

디테일패널의 출력에서 +를 눌러 추가했습니다.

함수의 실행 결과를 반환해주는 역할입니다.

 

 

Get Current Montage 노드를 통해 현재 애니메이션 몽타주를 가져오고 Is Valid 노드를 통해 유효한지 아닌지 불리언 값을 반환합니다.

Not Boolean 노드를 통해 애니메이션 몽타주를 하고 있지 않을 때로 가져옵니다.

 

 

함수를 클릭해 디테일 패널에서 퓨어에 체크해줍니다.

퓨어함수는 부작용 없이 입력에 대한 결과만을 반환하는 함수입니다.

 

이제 공격 컴포넌트를 만들 차례입니다.

 

 

새로운 블루프린트 클래스 액터 컴포넌트를 만들었습니다.

공격으로 이름 변경했습니다.

 

 

Get Owner 노드에 Cast To유저 노드를 연결하였습니다.

As유저를 변수로 승격하여 자신으로 이름 변경했습니다.

 

 

위에서 변수 승격한 자신을 Get으로 가져왔습니다.

자신유저 클래스의 정보를 가지고 있기에 유저 안의 공격 이벤트를 가져올 수 있습니다.

Event Tick 노드에 연결했습니다.

 

다시 유저 클래스로 돌아갑니다.

 

 

캐릭터 무브먼트를 가져와서 Disable Movement 노드를 추가합니다.

공격 몽타주를 수행하는 동안에는 다른 움직임이 불가하도록 만든 것입니다.

 

 

Set Movement Mode 노드를 통해 끝나면 이동 모드가 변경되도록 하였습니다.

New Movement Mode는 Walking으로 선택합니다.

 

함수를 만들었으니 공격 컴포넌트로 돌아갑니다.

 

 

자신유저 클래스의 정보를 가지고 있기에 방금 만든 공격할수있는가? 함수도 가져옵니다.

 

 

Get Component by Class 노드를 통해 전에 만들었던 인식 컴포넌트를 가져왔습니다.

이 값을 변수로 승격시켜 인식으로 이름 변경했습니다.

 

 

Event Tick 노드에 Is Valid 노드를 추가했습니다.

방금 변수로 승격한 인식을 가져오고 인식플레이어를 가져옵니다.

 

여기서 플레이어는 이전 게시물에서 만들었던 인식 컴포넌트의 변수이며 컨트롤러를 가진 캐릭터입니다.

 

 

인식에서 가져온 플레이어 변수와 자신 변수를 Get Distance To 노드를 추가하여 거리를 비교했습니다.

 

Vector가 아니기에 이전 게시글의 Distance(Vector) 노드가 아닙니다.

 

 

< 노드를 추가하고 아랫값은 변수로 승격하여 공격거리로 이름 변경했습니다.

둘 사이의 거리가 공격 거리보다 가깝다면 공격하도록 해보겠습니다.

 

공격거리의 디폴트값은 최소 100으로 해줍니다.

공격거리가 너무 짧을 경우 캐릭터의 크기에 따라 공격 이벤트가 나오지 않을 수 있습니다.

 

 

And Boolean 노드를 통해 두 개의 조건을 연결해주고 Branch 노드의 Condition과 연결했습니다.

현재 몽타주를 하고 있지 않고 공격 범위 안에 들어온다면 공격 이벤트가 나옵니다.

 

 

공격 이벤트의 몽타주를 변수로 승격하여 왼쪽 패널에서 우클릭합니다.

우클릭하면 배열로 토글되는데 이를 통해 몽타주 하나가 아니라 여러 개를 가져올 수 있습니다.

 

 

Get 노드를 이용하고 아랫값은 변수로 승격하여 번호표로 이름 변경했습니다.

여러 칸의 몽타주에서 순서대로 몽타주를 가져오도록 만들겠습니다.

 

 

변수 승격한 번호표 SET로 가져왔습니다.

몽타주 칸에서 순서대로 사용하기 위해 + 노드를 추가하고 아랫칸에 1을 입력합니다.

 

만약 이 상태로 사용하면 3번째까지 몽타주를 쓰고 4번째 몽타주는 없기 때문에 나오지 않을 것입니다.

 

 

% 노드를 통해 1씩 커지는 번호표에 몽타주의 갯수만큼 나누기를 해주면 나머지값이 번호표에 들어갑니다.

Length 노드를 통해 몽타주 노드의 갯수를 구해줬습니다.

 

 

이렇게 노드를 정리하여 몽타주가 순서대로 계속 나오도록 했습니다.

 

 

전체적인 노드 모습입니다.

공격거리와 몽타주는 인스턴스 편집이 가능하도록 눈을 띄워주고 나옵니다.

 

 

몽타주에 + 버튼을 눌러 엘리먼트를 추가합니다.

인덱스에 몽타주 3개를 넣었습니다.

 

 

몽타주를 만들 때 스켈레톤 트리에서 소켓을 추가하여 왼발로 이름 변경했습니다.

노티파이도 타격하는 타이밍에 추가하여 똑같이 왼발로 이름 변경했습니다.

 

유저로 다시 돌아갑니다.

 

 

메시를 가져와 Get Socket Transform 노드와 연결했습니다.

아까 만들어둔 Play Montage 노드에 Notify Name과도 연결했습니다.

 

 

Multi Sphere Trace by Profile 노드를 Play Montage 노드의 Notify Begin과 연결했습니다.

 

 

Get Socket Transform 노드를 구조체 핀 분할하여 Location을 Start, End에 연결했습니다.

 

 

Radius는 100, Profile Name은 pawn, Draw Debug Type은 For Duration으로 선택했습니다.

 

Profile Name을 이전에 만든 온리폰으로 하면 오직 폰에게만 데미지가 가는걸 볼 수 있습니다.

 

 

For Each Loop 노드에 Array Element는 Break Hit Result 노드와 연결했습니다.

 

Break Hit Result는 데이터를 추출하는 노드입니다.

 

 

Apply Damage 노드를 추가하였습니다.

Damaged Actor: Break Hit Result → Hit Actor (데미지를 받는 액터)

Event Instigator: Get Controller (데미지를 유발한 객체)

Damage Causer: Get a reference to Self (나)

 

이렇게 하여 완성했습니다.

 

 

▲ 인식, 추적, 공격 컴포넌트 사용

 

 

사용한 언리얼 버전: 5.4.1