초보 코린이의 성장 일지

UE4 State 무기 장착, 해제 본문

언리얼

UE4 State 무기 장착, 해제

코오린이 2023. 1. 12. 17:39

무기 애니메이션 적용 및 콤보 구현을 시작해 보겠다.

 

 

칼을 담당해주는 Combo_Sword 클릭

 

BeginPlay 이벤트도 오버라이딩한 상속 받은 상태기 때문에 부모를 먼저 콜 해줘야한다.

 

부모의 BeginPlay을 콜해준다.

Mesh에 칼을 붙여줘야 하기 때문에 Character 안에 있는 Mesh를 호출해준다.

소켓은 Holster_Sword로 위치를 골반쪽에 붙여준다.

칼을 들었으면 해제도 해야 하므로 Unequip도 동일하게 연결해준다.

 

칼 장착도 동일하게 노드를 연결해준다.

소켓은 Hand_Sword로 손으로 지정해준다.

 

오버라이딩 하는 방법은 직접 함수를 눌러서 하는 방법이 있고 custom으로 할 수 있다.

직접 눌러서 하는 경우 = 복잡한 이벤트 처리

custom = 간단한 이벤트 처리

 

사용할 함수, 변수 선언해준다.

 

Unequip에서 해제해주고 Moving는 Disable Control로 off시켜준다.

 

모든 명령은 Weapon Component를 통해서 들어오게 된다. 

SetSwordMode에서 세팅을 해놨으며, 플레이어로 가서 이벤트를 통해 전달해줘야한다.

State Component에서 Weapon Component가 Is Idle Mode일때 장착해야한다.

 

애니메이션 이벤트그래트에서 Blueprint Begin Play를 선언해준다. 이것 또 한 게임이 시작되면 바로 실행된다.

이 작업은 전에 했던 노드들을 조금씩만 수정해 줄 것이다. 아래 사진이 수정 후 사진이다.

사용 할 변수 선언

Character안에는 Waepon 컴포넌트가 있다.

Get Component by Class로 받아준다. 이게 null이 아니라면

Waepon 컴포넌트를 Set으로 저장해 준다.

On Weapon Type Changed 이벤트 바인딩 선언 -> 이벤트를 끌어서 커스텀 이벤트 추가해 준다 그리고 끈어서 따로 사용해준다.

이벤트는 다시 이벤트 생성으로 선언해주고 시그너처를 선택해준다.

그리고 변수 WeaponType으로 New Type에 연결해준다

새로운걸로 변경해준다는 뜻이다.

 

칼을 꺼내는 동작을 하게 만들어야 하므로, AnimGraph에서 Unaremd를 복사해서 안에 애니메이션만 수정해준다.

 

Weapon Type를 선언해주고 EWeaponType 블랜드 포즈에 연결해준다. 값에 따라 동작을 바꿔주는 역할을한다.

블렌드 포즈 -> Save Pose를 선언해주고 Body Pose로 변경해준다.

각 캐시포즈를 연결해주면 값에 따라 움직인다.

 

UpperBody에도 동일하게 연결해준다.

 

위 작업들이 끝이나면 Type가 바뀌면 자연스럽게 애니메이션이 동작한다.

 

애니메이션 이벤트그래프

위에 Begin Play를 받아 이벤트를 받아 시작되는 이벤트이다

Character을 검증된 Get로 변환해서 선언해서 이어준다. 전에 했던거에 앞에만 수정했다.

 

구조체 하나 만들어준다. 액션을 수행한다는 의미로 만들어 놓은 것이다.

그리고 필요한 구조체들을 지정해 놓는다.

 

지난번에 했던 DT_Equip_Sword

원하는 폴더에 우클릭 후 임포트 눌러서 가져오면 된다.

지난 시간에도 했던 작업과 동일하다 엑셀 파일에 위에 있는 구조체 정보에 들어갈 애니메이션 몽타주와 옵션 등을

설정해주고 저장해 가져온다.

 

이제 가져온 데이터들을 읽어야 한다. 그래서 Weapon으로 돌아가 보자

 

사용할 함수 및 변수들 목록이다.

 

아래에 사용 할 변수
이벤트그래프 동작 내용

Do Action Data Table를 행을 하나가 아닌 지정해 놓은걸 다 가져와야 하므로 For Each Loop로 연결시켜준다.

그러면 데이터 테이블에서 읽을 수 있게 된다.

 

 

선언한 함수 변수들로 작업 시작

 

Begin Do Action

액션에 들어왔다는 뜻 ture 체크

End Do Action

In Action은 해제해주고, 공격 모드에 들어가면 Action 모드로 바꿔줘야한다.

State에서 Idle로 가게 만들어주고, 이동은 필요에 따라 금지시킬 수 있도록 Moving으로 Move를 다시 호출해준다. 

 

 

사용할 함수 변수, 콤보 활성화 구간을 만들어 줄 것이다.

 

콤보 가능이면 Enable true, 불가능이면 false 체크해준다.

 

 

오버라이딩한 3가지 함수
DoAction

Do Action Datas가 배열로 선언되어 있으니, 동작이 하나 이상이 있어야므로 Length가 더 크다면 If로 간다.

Enable로 콤보가 켜져있다면 다음 동작으로 가야하니 If로 연결해준다.

콤보가 켜져있으니 Enable 해제해주고 Exist 활성화 해준다.

콤보구간이 아니면 최초공격을 시작 할 구간이기 때문에 State가 Is Idle Mode이라면 If로 걸어준다.

그리고 다시 State가 Action Mode 들어가면 

Index로 판단해서 Play Action Montage를 실행시킨다. 

 

Begin Do Action

오버로딩 되어있기 떄문에 부모를 불러주고

액션 Exist가 존재하면 Exist 해제시켜주고 Index를 증가해준다.

그럼 다음 동작이 플레이된다. 

 

End Do Action

Index만 초기화 해주면 된다 나머지 내용은 부모한테 있다.

 

WeaponComponent로 돌아가서 정리해준다.

DoAction = Idle이 false라면 Do Action 명령을 내려준다.

Begin_DoAction = 검이 들어왔는지 검사

End_DoAction = 똑같이 검이 들어왔는지 사

 

 

위에 동작이 되려면 StateComponent도 추가해줘야한다.

안에 있는 함수 목록이다 하나씩 지정해 놓겠다.

 

각 State를 변경하는 지점으로 이름을 대조해서 보면 된다.

 

매크로 라이브러리를 하나 생성해 준다.

해당 클래스에 노드접기(입력,출력 기능이 있는) 기능들을 사용 할 수 있게 해주는 기능 해당 타입이 있어한다.

 

Weapon에 배열로 잡아둔 기능을 사용 할 수 있어 Do Action Datas를 선언한다.

하나 이상있는지는 판단을 하고 들어오게 되기 때문에 Get으로 받아 Break 선언 후 연결

Character에 목록을 몽타주에 넣어준다.

Moving로 움직일 수 없는지 확인해준다.

 

이제 노티파이를 생성해준다.  애니메이션을 실행 시켜줘야하기 때문

 

위 내용은 AN_BeginAction 내용으로 Begin Do Action 콜해주게 된다.

 

 

AN_EndAction 내용

 

ANS_Combo 내용

중요한것은 Weapon_Combo로 형변환이 되는지 확인해줘야한다.

 

ANS_Equip 내용

 

노티파이완성 됐으니 이제 애니메이션 몽타주로 가서 작업 진행

 

 Sword_Attack_1 번 동작

 

 Sword_Attack_2 번 동작

 

 Sword_Attack_3 번 동작

 

이제 Player로 가서 명령만 내리면 된다.

 

Weapon Component에서 Do Action만 콜해주면 끝난다. 

 

플레이어가 들고 있는 검을 지정해줘야 공격이 나간다.

 

Enemy와 이제 충돌이 되는지 실험해 볼 것이다.

 

Weapn Component로 돌아와서 Collision 함수들 작업 시작

 

충돌을 키는 작업으로 for으로 돌려준다 Type 설정

 충돌을 끄는 작업

 

Weapon_Combo 이벤트그래

클래스 타입을 Shape Component를 하면 모든 관련된 자식들을 불러오게된다.

충돌을 체크 Off Collsions를 먼저 체크

충돌 했을때 이벤트 연결을 위해 for을 돌려준다.

이벤트 바인딩을 통해서 이벤트들이 심어지면

OnComponent Overlap로 판단해준다. 

Character가 Other Actor와 같으면 안되므로 != 로 체크해준다.

Actor을 가져다가 Character로 형변환 해준다. 

마지막으로 ShapeComponent로 충돌체 정보가 맞는지 확인해준다

 

 

- 정말 중요하지만 너무 어렵다

- 계속 반복 학습을 해야겠다.

Comments