초보 코린이의 성장 일지

UE4 플레이어와 적 애니메이션 하나로 사용하기 / 무기 클래스 나누는 과정 밑작업 본문

언리얼

UE4 플레이어와 적 애니메이션 하나로 사용하기 / 무기 클래스 나누는 과정 밑작업

코오린이 2023. 1. 10. 15:06

새로운 파일을 생성하고 지난시간까지 사용하던 폴더에서 필요한 것만 가져와서 다시 작업을 해보겠다.

플레이에 기본적인 틀은 거의 동일하니 큰 상관은 없을 것이다.

도형들과 머터리얼 색을 입혀서 단순하게 만들어 본 것이다.

이제 FSM이 아닌 State로 이제 움직임을 변경해 볼 것이다. 그래서 ABP 플레이어와 상대방(적)을 한번에 묶어서 사용할 것이다. 이름만 바꿔준 것 일뿐 전과 동일하다. 내부적인건 이제 수정해 볼 것이다.

앞에 블로그 내용에도 나와있는 ABP_Player 이벤트 그래프이다. 이제는 통일할 것이기 때문에 필요없는 동작들은 제거해주고 위처럼 필요한것만 남겨두게 될 것이다. 또 한 변수 기존 Player 이름 및 유형을 Character로 변경해준다.

폴더에 오른쪽 마우스 클릭 -> 블루프린트 클래스 -> 게임 모드 베이스 생성

게임전체를 수행 할 때 어떤 규칙을 가지고 있는 클래스를 지정해주는 모드이다

 

만든 게임모드를 클릭하고 들어오면 오른쪽 Classes창이 나올 것이다.

위에 보이는 Default Pawn Class를 BP_Player로 변경해준다.

Game Session Class = 게임 로그인시 사용자 정보를 담고있는 것을 세션이라 부른다.

Game State Class = 이 게임에 대한 상태를 나타낸다 일시정지, 진행 중인가 등등

Player Controller Class = 키보드에 입력이나 패드 입력이 있을수도 있지만 외부에서도 있을 수 있기 때문에 여기서 관리

Player State Class = 플레이어 상태를 나타낸다. 스턴 걸렸는지 사망했는지 등등

HUD Class = 게임안에 있는 UI라고 생각하면된다.

Default Pawn Class = 게임이 실행될때 기본으로 지정될 플레이어 클래스를 나타낸다.

 

이제 게임모드로 실행 시킨다는걸 프로젝트에 알려줘야한다. 

세팅 -> 프로젝트 세팅 -> 맵&모드 -> 기본모드 BP_GameMode로 변경 -> 에디터 시작맵 Level 변경

 

세팅이 완료되면 비로소 캐릭터가 맵에 등장한다.

 

프로젝트를 새로 만들어서 진행하고 있기 때문에 키세팅 되있는걸 다시 하기 번거러울 수 있으니 가져오는 방법이 있다.

기존 프로젝트 파일로 들어가서 오른쪽 상단에 익스포트를 눌러 아무 위치나 저장해준다.

그리고 현재 프로젝트로 돌아와 오른쪽 위 임포트를 눌러서 가져오면

아래와 같이 저장했던 매핑들이 들어온다.

 

새로운 폴더를 생성해주고 이제 State를 사용하기 위해 블루프린트 클래스 생성을 눌러 Actor Component를 생성해 준다.

2가지다 사용하게 될거라 미리 만들어 둔 것이다. 우선은 StatusComponent로 들어가서 작업을 해보겠다.

 

변수 CanMove를 만들어 주고 함수 IsCanMove를 생성해준다. 함수는 리턴용으로 사용 할 것이고, 리턴함수는 실행핀 없는 퓨어함수라고 불린다 그래서 퓨어 체크란을 체크해준다. 그럼 리턴 전용함수로 된다.

 

함수 2개 더 생성

Move함수
Stop함수

조건 체크만 반대로이다.

 

이제 BP_Player로 돌아가서 할당을 해 줄 것이다.

컴포넌트 추가를 눌러서 아래로 내려보면 컴스텀에 만들어 놓은 컴포넌트들이 존재하게 된다.

생성해준다.

 

위처럼 만들어 주고 컴포넌트에 기능으로 BP_Player가 실행되면 Status컴포넌트를 자동생성하고 Begin이벤트를 자동으로 콜해준다.

원래 기존에 있던 BP_Player 이벤트 그래프에서 컴포넌트 추가해 놓은 Status만 가져와 함수 Is Can Move와 연결해 true면 실행 하도록 연결해준다. 

 

노드를 보기 편하게 접어두고 구역 표시도 해준다 Walk는 Run이였던 부분을 이름만 수정했다.

카메라 세팅도 동일하게 해준다.

 

세팅이 끝나고 다른 작업을 하게 될 거라 아까 만들어둔 컴포넌트중 Status를 Moving로 변경해주었다. 이유로는

딱 움직임만을 위해 만들어 두었던 컴포넌트이니까

 

이제 State를 다루게 되니 폴더안에 위와 동일하게 열거형을 생성해준다. c++에서 보던 enum과 동일하다

오른쪽 위 추가 버튼을 눌러 동작들을 나눠준다. enum과 동일하게 맨 위 첫번째가 1번이다. 

 

StateComponent로 돌아와 변수 Type를 생성해 주고 변수유형을 우리가 만들어준 EState로 변경해준다.

 

함수를 생성해주고 노드를 연결 시켜준다. 

Type를 가져다 == 을 검색해 enum으로 불러오고 return을 검색해 반환 노드를 생성해 연결해준다. 그리고 반환 노드는 당연히 리턴형이기 때문에 퓨어 함수로써 퓨어 체크란에 체크를 해줘야한다.

 

 

이벤트 디스패처

-무언가 동작을 취한다라는 것은 이벤트를 뜻한다. 언리얼에서는 이벤트들을 편리하게 다루기 위해 쓰는 방법이 있다. 그것이 이벤트 디스패처라고 말한다. 

-만약 플레이어와 적 등등이 존재하고 플레이어가 만약 어떤 행동을 계속 바꿨을때 영향을 받는 존재들이 생기기 때문에

함수를 등록해 놓고 그때만 콜해서 충돌을 안나게 만들어 주는 기능을한다. 게임에서는 UI나 Map디자인 등등 많은 곳에 사용된다. 

-간단하게 생각하면 함수포인터를 배열로 만들어서 객체를 가지고 사용하는게 아닌주소만 가지고 사용하는것이다.

 

이벤트 디스패처와 로컬 변수를 생성해준다. 그리고 동일하게 StateComponent에서 노드를 작성할 것이다.

 

기존 Type를 가져다가 임시로 저장을 할 것이다. 다시 Type에다가 값을 보내준다.

위 식대로 연결하면 이전꺼와 다음꺼를 바꾼다는 뜻이다.

Change Type안에 NewType로 파라미터 하나를 넣어준다.

 

만들어 놓은 이벤트 디스패처를 올려놓으면 위와 같이 나오게 되는데

호출 = 등록된 모두를 호출 시켜주는 것

바인드 = 함수를 등록해서 연결

언바인드 = 끊어주는 것

 

이벤트 디스패처를 생성하고 클릭 후 오른쪽 위에 새 파라미터를 추가해 주면 위와 같이 변경된다.

그리고 전과 후로 나눠준 노드를 연결해준다.

 

 

Set Idle Mode로 가서 Change Type를 연결 

Idle로 바뀌는것이기 때문에 이대로 나둔다.

 

함수 추가해준다.

 

둘다 타입을 Equip로 변경

 

이제 플레이어가 사용해야 하기 때문에 StateComponent 컴포넌트를 추가해준다.

 

BP_Player로 돌아와 커스텀 이벤트인 OnStateTypeChanged가 콜 될꺼라는 의미이다. 이벤트 바인딩에 등록되어 있기 때문 모드를 바꿀때마다 콜이 되면서 자동으로 커스텀 이벤트가 바뀐다.

우선은 Print String로 확인을 해보겠다.

커맨드를 입력할때마다 변경되는게 눈으로 보인다.

 

만약 이벤트 바인딩을 별도 구역으로 나눠서 멀리서 콜해주고 싶으면 위처럼 이벤트 생성을 해서 직접 불러서 콜해준다.

 

이제 사용방법을 알았으니 노드를 다 삭제해주고 무기를 들게 만들어 보겠다.

 

1. 컴포넌트 이용해서 분리하는 방법

2. 인터페이스를 이용해서 분리하는 방법

2가지를 다루게 될 것이다.

 

Weapons폴더를 만들고 열거형으로 하나를 생성해준다.

 

똑같이 State를 작성해준다.

블루프린트 클래스 Actor을 선택해 생성

 

Actor 컴포넌트 생성 눌러서 똑같이 Weapon 전용으로 만들어준다.

 

동일하게 변수 Type 만들어주고 유형을 변경해준다.

안에서 함수 생성

동일하게 노드를 연결해주고 반환 노드 퓨어체크 해주기

다시 Weapon으로 들어가서 함수를 생성해준다.

 

그리고 다시 WeaponComponent로 돌아와 변수 Weapon을 생성해주고 변수 유형도 변경해준다.

 

SetUnarmedMode 세팅

IsUnarmedMode에서 true인 상태에서 SetUnarmed가 들어오면 아무 동작을 안해도 된다.

하지만 IsIsUnarmedMode가 아니라면 이미 하나의 무기가 장착되어 있다는 뜻이다.

그리고 이미 장착되어 있다면 이 변수는 Null이 아니라는 뜻이 된다.

 

기본적인 작업은 끝이났다. 다음에 진행해 볼 것이다.

 

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

 

- 이론적으로는 편해 보이나 구현에 있어서는 어려운 감이 있다.

- 이해를 하고 넘어가지 못하면 힘들어 질 거 같다.

'언리얼' 카테고리의 다른 글

UE4 State 무기 장착, 해제  (0) 2023.01.12
UE4 State로 동작 및 무기 교체 작업  (0) 2023.01.11
UE4 적과 충돌시 적 모션 변화  (0) 2023.01.09
UE4 충돌 및 적과 충돌  (0) 2023.01.06
UE4 몽타주 사용, 캐릭터 콤보  (0) 2023.01.05
Comments