Unreal Engine/게임클래스 - 언리얼엔진 기초

[8강] State Machine

whereareyoung 2023. 7. 19. 14:48

Jump 구현

1. 프로젝트세팅 > 입력 > Action Mappings > Jumping 생성 > 키보드 스페이스 바

버튼을 눌렀다 뗐을때의 값으로 입력받는 것이기 때문에 "Action Mappings" 기능으로 구현 

2. "BS_Player" 스크립트에 "Jumping 입력" 액션 이벤트 함수 추가 

플레이어 블루프린트에 들어가서 설정을 해준다

3. "Moving" 접힙 그래프 업데이트

그래프를 접어놨었는데, Moving과 관련되어 있는 움직임이니 여기에 다음과 같이 추가하여 주었다. 

1) "Jump" 함수 추가 

*Jump : 실행시 Z(수직) 값이 가속되면서 점프를 시작하게 해주는 함수 

2) "StopJumping" 함수 추가

* StopJumping : Z(수직) 값이 가속되면서 점프를 수행하는 것을 멈춰줌

점프 범위가 차등이 있을경우 StopJumping 설정이 중요한데, 오늘 작업에서는 사용하지 않음 

 

4. "BS_Player" 캐릭터 블루프린트 "CharacterMovement" 에서 점프 값 조정

   - Jump Z Velocity : 점프할 때 초기속도

   - Braking Deceleration Falling : 떨어지는 상태에서 일어나는 감속 (가속을 적용하지 않았을 때)

   - Air Control : 공중에서 얼마나 크게 움직일 수 있는지, 공중에서 뭔가 하려고 할때 이용

   - Air Control Boost Multiplier : 부스트

   - Air Control Boost Velocity Threshold : 부스트

   - Failling laterial Friction : 떨어질 때 적용할 마찰 

   - Impart Base Velocity X : 떨어질 때 속도를 전달 

   - Impart Base Velocity Y : 떨어질 때 속도를 전달 

   - Impart Base Velocity Z : 떨어질 때 속도를 전달 

   - Impart Base Angular Velocity : 떨어질 떄 각 탄젠트의 속도를 전달 

   - Notify Apex : 점프의 정점이 있을때 이벤트 발동 

 

여기까지 진행 하였을 경우 점프 구현은 완료되나, 애니메이션 동작까지 적용을 마무리 하여야 한다. 

 

Jump 애니메이션 구현

FSM(Finited State Machine), 스테이트 머신 

   - 조건에 의해 기존 애니메이션에서 다른 애니메이션으로 전환하는 것을 관리해주는 기을 관리해주는 Machine.  

   - 복잡한 애니메이션 구현에 사용 

 

1. 애니메이션 블루프린트  > 애님그래프  > 상단 탭 

애니메이션을 체크 및 테스트하고 블루프린트로 전환하며 편하게 작업할 수 있음

 

2. 스테이트 머신 추가 > 그래프 노드이름 "Jumping" 

지금은 Jumping만 추가하였는데, 무기 쓰는 자세 등도 이 탭을 통해 구현할 수 있다.  

 

3.  "최종 애니메이션 포즈" 노드와 연결 

4. "Jumping" 세팅

1) "Jumping" 을 더블클릭하면 "Entry" 가 존재하는데, "Entry"에 연결된 동작이 기본동작이 되며 조건에 따라 다른 애니메이션을 출력하게 될 것이다. 

2) BS_Unarmed(전에 만들어두었던 Idle, 걷기, 뛰기가 들어있는 BlandSpace)를 Entry로 설정해 기본애니메이션 상태로 만들어준다. 

3) JumpStart, JumpLoop, JumpEnd를 가져와 다음과 같이 연결한다. 

* 외곽 선을 끌어주면 화살표 연결이 가능

 

5. Transform(전이) 설정 - JumpStart 

1) 연결 후 생성된 마크를 더블클릭해 열어준다. 

2) "In Air", Boolean 변수를 다음과 같이 생성, get해 연결해 준다. 

* Can Enter Transition : True면 애니메이션 상태를 상태를 Transform(이전) 시킴.

 

우측 에셋브라우저 옆 애님프리뷰에디터에서 In Air 체크를 하면 적용된 애니메이션을 확인 할 수 있다. 

* "애님프리뷰에디터"가 비활성화 일 경우 : 창 > 애님 프리뷰 에디터 

 

그래프를 통해서도 확인이 가능하다. 

 

6. Transform(전이) 설정 - JumpLook

1) Transform > Time Remaining(ratio) (Unarmed_JumpStart) 생성 > "float < float"를 사용해서 연결 

   * Time Remaining(ratio) : 애니메이션이 플레이된 비율 (Ratio) 를 리턴해줌, ratio의경우 시작이 0이고 끝이 1의 값을 가진다. (ex. 30초짜리면 30초가 1의 값을 가짐)

   * Time Remaining : 애니메이션이 플레이된 절대 시간을 리턴해줌 (ex. 30초면 0부터 30까지의 값을 가짐)

 

remaining은 남은 시간을 의미하는데 프로그래밍할때는 0부터 1까지의비율로 만들어서 계산하는것이 장기적으로 봤을때 유지보수가 쉬워서 ratio를 이용해 작업하도록 함

2) 값을 넣어주고 다음과 같이 연결 

조건 float < float 으로 남은 시간이 지정해준 값보다 작을 때 (50% 가 플레이 된 시점일 때), True가 리턴이 되고 다음 애니메이션으로 Transition되게 됨 

 

7. Transform(전이) 설정 - JumpEnd

get "In Air" > Not Boolean 함수 > 연결 

공중이면 True, 공중이 아니면 False 가 되어 다음 애니메이션으로 Transition 된다. 

 

8. Transform(전이) 설정 - 다시 "BS_Unarmed" 로 돌아오기 

Trans Remaining (ratio) 함수 생성 < "float < float" 함수 < 결과와 연결 

공중상태가 아닐때 다니 기본애니메이션으로 돌아오기 위한 설정

애니메이션이 10프로정도 진행된 상태에서 True로 들어오게됨 

 

9. 테스트 

컴파일 후 애님그래프로 돌아와서 점프 애니메이션 테스트 

1) In Air 가 체크되어 있을 때 "BS_Unarmed" 에서 "Unarmed_JumpStart"로 넘어가서 플레이가 되다가 50%가 넘어간 시점에서 "Unarmed_JumpLoop" 로 진행이 됨

2) In Air 가 체크가 안 되어있는 상태일때 JumpEnd가 시작되고 애니메이션 진행이 10퍼센트 가 되었을때 "BS_Unarmed"로 복귀됨 

 

애니메이션 적용

애니메이션 블루프린트 > 이벤트 그래프

정상적인 구현을 확인했으니 애니메이션을 적용시켜주기 위해 이벤트 그래프를 업데이트 

1. Valid 식이 너무 길어질 예정이니 Pin off 해서 끊어주기 

2. 시퀀스 추가 

* Sequence : 연결된 실행핀을 순서대로 실행시켜줌 

 

3. Then 0을 Set 과 연결 > Then 1을 Set in Air과 연결 

0을 실행하고 난 후에 1을 실행하게 됨

4. In Air 정보를 받아 올 수 있게 설정 

BP_Player > Get Movement Component > Is Failling > In Air 연결 

연결해 놓은 In Air 를 실행 할 수 있도록 세팅

* Jump가  공중에 있느냐 등을 판단하는 CharacterMovement 의 값을 가져다가 쓰고있고, CharacterMovement는 Pawn 에 Movement Component 를 상속받은 상태이기 때문에 get character movement component 함수는 찾을 수 없지만 get movement component로 검색해 찾을 수 있음 

(Pawn에 Movement Component 를 리턴해주는 함수이기 때문에 character movement compontnt 가 리턴됨)

* is Falling : 추락(공중에 있는 지) 체크하는 함수  

 

In Air 가 True 가 되면 Jump애니메이션 루틴이 실행되게 되는데, 땅이면 False 가되니까 다시 Unarmed 애니메이션을 실행하게 된다.

 

5. BS_Unarmed 애니메이션 설정 

get Speed > Speed 정보에 연결 

 

컴파일 후  게임모드 테스트

디버그 필터 걸어놓고 F8로 빙의 풀면서 실시간 애니메이션 확인 가능