초보 코린이의 성장 일지

UE4 State로 동작 및 무기 교체 작업 본문

언리얼

UE4 State로 동작 및 무기 교체 작업

코오린이 2023. 1. 11. 17:11

디테일 부분에서 빼먹을게 생길만큼 어려운 내용이다.

그래도 정리를 시작해 보겠다.

 

우선 무기를 바꾸기 위한 기본적인 틀을 만들어 보겠다.

WeaponComponent 노드

변수유형 weapon type로 Tpye와 PrecType를 만들어준다.

Type를 Prec Type에 세팅해주고 현재 타입 Type에 받아준다. 이벤트 디스패처를 만들고 파라미터 2개를 생성해준다.

디스패처안에 Type 자리로 받아준다.

 

SetUnarmedMode에서 교체할 Type를 콜해준다. 

Unequip 상태니 In New Type는 Unarmed로 지정해준다.

 

이제 SetMode 무기가 원래 장착 안되어 있다면 장착하고 장착하고 있다면 해제하고 장착하도록 구현할 것이다.

장착할 SetMode에 무기를 파라미터도 받아준다.

새로 장착할 무기가 기존 타입과 같다면 해제가 되고, 그게 아니라면 다른 조건으로 갈라야한다.

 

아래 노드 순서 설명
뒤에 추가된 부분

이 과정을 새로운 무기를 장착해 주기 위한 작업이다.

1. 장착한 무기가 같다면 Set Unammed Mode로 가고 같지 않다면 if 조건으로 또 나눠준다.

2. 이제 무기가 장착되어 있냐 아니냐를 판단해야한다.

3. Is Unarmde Mode가 장착이 안되어 있다면 ture로 갈 것이고 장착이 되어있다면 Weapon으로 가서 해제해 주면 된다.

4. 다시 현재 무기를 Weapon을 받아서 바꿔주고, 새로운 무기를 세팅해주면 된다. 위 그림에 Weapons를 만들어 주고 배열로 만들어준다. 왜냐면 여러가지 무기를 만들어 줄 것이기 떄문

5. Weapons를 가져다가 GET로 받는다 그리고 몇번째 New Type를 확인하기위해 받아주고 to_int로 연결해준다.

6. 그럼 선택된 무기가 Set Weapon에 세팅이 완료된다. 

7. 근데 만약 무기가 없다면 Is Valid로 체크를 해준다.

8. 이제 장착 명령을 Weapon을 가져다가 해주면 된다.

9. Weapon에서 Equip 명령을 내려주고 Change Type로 타입을 변경하라고 전달해준다. 

 

 

위 UnarmedMode에서 무기를 해제하고 끝이나기 때문에 다른 무기로 바꾸라는 뜻이 아니다 그래서 함수 SetMode

함수 SetSwordMode를 만들어준다 칼 장착하는 행동이 되고, Type를 Sword로 바꿔주면 된다.

 

이제 Weapon으로 들어와서 작업을 해야한다. 이제 Equip는 모든 객체에 공통으로 사용 될 것이다.

하나만 잘 짜놓으면 이제 추가하는건 쉽게 된다.

 

사용될 변수 및 함수 등등 선언해준다. 컴포넌트들은 변수유형을 자신의 맞는 컴포넌트로 등록해주면 된다.

 

아래 설명할 노드들 접어놓은 최종 상태 아래와 비교하면서 보면된다.
Set Owner 내용

이제 무기의 소유자를 선택해줘야한다. 그래서 Character로 모든 움직이는 객체를 통합해준다.

Get Owner로 Character을 통해 형변환을 해준다 자신들이 받을 것이기 때문에

그리고 Character로 값을 받아준다.

Set Component 내용

BP_Player에 있는 MovingComponent와 StateComponent를 가져와서 저장해 줄 것이다.

Actor안에 컴포넌트를 return 받는 함수 Get Component by Class로 받아준다. 

Class 지정해놓은  Set으로 받아준다. Moving도 이어주면 된다. 

 

이제 Equip에서 작업을 하게 된다.

 

 

무기마다 장착 방법이 다 다르기 때문에 구조체를 하나 만든다.

 

구조체 4가지를 만들어준다.

 

사용할 애니메이션 몽타주를 생성해준다.

 

드래그해서 Sword_1 뒤에 올리면 자연스럽게 2번이 들어간다.

그리고 뛰어가면서 무기를 뽑아야하므로 UpperBody로 선택해줘야한다.

 

설정이 끝난 몽타주를 레퍼런스 복사를 해준다.

 

엑셀을 사용하여 값을 넣어줄 것이며, 위에 표대로 작성해 놓는다.

 

프로젝트 파일 Sword에 들어가 저장해 줄 것이다. 파일형식은 위처럼 CSV로 해준다.

이름도 Data_Equip_Sword로 만들어준다 이름 그대로 의미를 가지고있다.

 

이제 폴더로 돌아가서 임포트를 눌러주고 적용을 눌러서 생성해준다.

그러면 세팅값이 다 들어온다.

 

다시 Weapon으로 돌아와서 Data Tables에 생성해주고, 변수유형은 Data Table로 설정해준다.

 

Load EquipData 설명

 

Get Data Table Row Names를 사용하면 엑셀에 첫칸에 입력한 행 이름들이 들어오게된다.

사본으로 나올때는 참조할 수 없는 상태를 말한다. 참조를 사용하면 된다.

가져온 테이블을 테이블 행 가져오기에 연결해서 Equip Data에 저장해준다.

 

Moving 컴포넌트를 클릭해준다 그리고 함수 변수를 생성해준다.

Moving 이벤트그래프 내용
Enable Control Rotation

정면 바라보게 만든 상태

 

Disable Contorl Rotation

위 정면과 반대로 체크만 해줬다.

 

위 설명은 아래와 같다.

1. Data Tables 카테고리 안에 만들어 놓은 변수 EquipData를 구조체 핀 분활로 만들어준다.

2. Moving가 True라면 Enable 컨트롤러 켜주고 False일때는 Disable 컨트롤러를 켜준다.

3. 두개가 실행되고 다시 if로 나눠준다.

4. Moving가 True일때는 Move로 가고 False일땐 Stop로 간다.

5. 몽타주가 없다면 플레이를 안하도록 Move와 Stop를 Is Valid로 보내준다.

6. 몽타주가 있다면 캐릭터에 몽타주를 플레이해줘야한다.

7. Character에서 Play Anim Montage로 연결해준다. 그리고 Get Equip Data핀분활한 Rate를 연결해주면 지정한 속도로 플레이가 될 것이다

8. 그럼 몽타주안에서 begin_equip, end_equip가 실행된다. 

9. Is Valid에서 false일때 (null)이라면 몽타주가 실행이 안될테니 함수로 따로 콜을 해줄 것이다.

 

Begin Equip

장착이 완료되었으니 true로 체크해준다.

End_Equip

장착이 완료됐으니 해제해주고, In Equip는 true로 만들어준다. 장착이 다 완료되었으니 State를 Idle 모드로 돌려주고

이동이 정지 되었을 수도 있으니 다시 Move를 콜해주면 된다.

 

노티파이를 생성해준다.

 

GetNotifyName
Received_NotifyBegin

노티파이에서도 Weapon을 통해서 하면된다.  

Get Owner이 Character이기 때문에 안에 Weapon이 들어있다.

Get Component by Class를 선언해주고 Weapon 컴포넌트를 선택해준다.

Is Valid를 통해 Null이면 안되기때문에 연결해주고 Begin Equip에 이어준다.

Received_NotifyEnd

위와 동일하다 End_Equip로만 변경해주면된다.

Received_NotifyTick

다시 웨폰컴포넌트로 간다.

Weqpon을 장착, 해제를 만들어준다.

 

무기타입들을 여러개 다룰 것이기 때문에 Weapon으로부터 상속받은 객체들을 변수유형 클래스 레퍼런스로 받아준다.

여러타입을 받을 것이기 때문에 배열로 받는다. 

WeaponClasses는 공개를 할 거지만 나머지는 프라이빗으로 닫어준다. 

 

 

이제 콤보기능을 만들기 위해 Weapon을 눌러 자손 블루프린트 클래스를 생성해 준다.

 

생성한 Combo를 상속받아 위와 동일하게 Sword도 생성해준다.

 

이제 BP_Player로 가서 배열을 8개 만들어준다 동작 개수가 8개라서 미리 생성해 둔 것이다.

2번을 누른다면 저 유형을 등장시킨다는 뜻이다.

 

1. 만든 Weapon Classes를 가져와 이 클래스가 Null이 아니라면 Valid로 연결해줘서 확인한다. 

2. 그리고 if를 사용해서 스폰엑터에 연결해 어디다가 등장 시킬지 Spawn Transform에 연결해준다.

3. Weapon 컴포넌트를 가지고 있는건 캐릭터니까 Get Owner로 연결해줘야 캐릭터인지 인지한다.

4. 그리고 나온 결과를 Wanpons에 저장해준다.

5. 배열에 해당 번호를 일치시키기 위해 Set Array Elem에 넣어준다.

6. 그리고 Index 몇번에 넣을 것인지 알기 위해 For Each Loop 인덱스를 연결해준다.

7. 그러면 생성 후 해당 배열에 저장된다.

 

위 과정을 거치게되면 게임이 실행되면 BP_Player가 실행되면서 생성자가 먼저 콜이 된다.

그리고 컴포넌트에 Begin Play가 실행이된다. Weapon 컴포넌트에 Begin Play에 무기등장 시킨 것을 넣어뒀기 때문에 플레이가 되면서 등장까지 하게 된다.

 

 

_번외로 중요한 것_

SpawnActor를 보면 Class란이 있다. 

C++에서 int라는 자료형을 클래스로 가져와 쓸수 없다. 말이안된다

하지만 언리얼에서는 자료형을 클래스로 사용 할 수 있게 허용이 된다.

즉 자료형 자체를 변수형으로 다루는 방법이다 

이 방법을 리플렉션이라 부른다. 중요하다!!!!

 

 

- 정리를 하면서도 잘 모르겠다

- 반복적으로 숙달해서 익혀야겠다

- 너무 어려워진다

Comments