Unreal Engine Blueprint #3

_ dfdeer·2025년 5월 2일
post-thumbnail

5. 캐릭터 이동 구현

개념 알기

블렌드 스페이스(Blend Space)

블렌드 스페이스는 여러 개의 애니메이션을 1/2차원 그래프를 이용해 블렌딩 해주는 도구이다.

스테이트 머신(State Machine)

스테이트 머신은 조건에 따라 상태를 변경하고, 각 상태에서의 동작을 결정해주는 도구이다.

구현해보기

1. 점프 구현

우선 이전에 만든 IA들 처럼 똑같이 점프에 관한 액션을 다루는 IA_Jump 를 생성해주었다.

내부에서는 Details 패널에서 Action > Value Type 이 Digital(bool) 로 되어있는지만 확인하면 된다.
점프는 방향성을 가진 동작이 아니기 때문에 참, 거짓만 판별하면 되기 때문이다.

그런 다음에는 IMC 에 IA_Jump 를 추가해주면 된다. 다른 추가 설정은 필요없다.

이 후 블루프린트 노드는 IA_Jump 와 Jump 를 연결해주기만 하면 끝이다.

점프의 높이는 Character Movement 컴포넌트에서 Details 패널에 있는
Character Movement (General Settings) > Gravity Scale 의 값과,
Character Movement: Jumping / Falling > Jump Z Velocity 의 값을 조정해주면 된다.

Gravity Scale 은 값이 높아지면 점프되는 정도가 낮아지고,
Jump Z Velocity 는 값이 높아지면 점프의 속도가 늘어나는 것 같다.

나는 각각 2.0, 그리고 600.0 cm/s 로 설정을 했다.

점프도 잘 작동하는 것을 확인했지만, 영상 첨부는 뒤에 작업이 남았기에 모두 끝내고 할 예정이다.

2. 애니메이션 적용

이제 캐릭터가 움직일 때 자연스럽게 달리고 점프하는 모습을 연출하기 위해서 애니메이션을 넣기로 했다.

우선 폴더 안을 우클릭하여 Animation > Animation Blueprint 를 우리가 쓰고 있는 메시인 SK_Mannequin 으로 하나 생성해준다.

이름은 ABP_Character 로 해줬고, 블루프린트 파일이 여러개가 있기 때문에 폴더를 하나 만들어 BP_Character 도 안으로 옮겨줬다.

하지만 이대로라면 애니메이션은 ABP 에만 적용되어 있을 것이다.

그래서 BP_Character 블루프린트로 넘어와서 BP_Character 컴포넌트를 선택해주고

Details 패널의 Animaition > Anim Class 를 아까 우리가 만든 ABP_Character 로 설정해주면 된다.

이제 ABP_Character 블루프린트를 열어보면 이런 화면이 뜬다.

오른쪽에 Asset Browser 목록을 보면 여러가지 애니메이션이 있는데, 이 중에 저 6가지만 사용할 예정이다.

MM_Fall_LoopMM_IdleMM_JumpMM_LandMM_Run_FwdMM_Walk_Fwd
떨어질 때가만히 있을 때점프할 때착지할 때앞으로 달릴 때앞으로 걸을 때

이제 애니메이션을 다루기 위해서 블렌드 스페이스가 하나 필요하기 때문에
Animation > Blend Space 를 하나 만들어서 BS_RunWalk 라는 이름으로 MyCharacter > Anim 폴더에 넣어준다.

블렌드 스페이스 파일을 열어보면 이런식으로 창이 뜬다.


아래에 보면 우리가 사용할 그래프가 있다.

왼쪽에 있는 Asset Details 패널에서 Axis Settings 에 그래프의 가로축(Horizontal Axis) 과 세로축(Vertical Axis) 에 관한 설정이 있는데,
여기서 세로축의 이름을 Speed로, 최소값는 0.0, 최대값은 500.0 으로 세팅해주었다.

그리고 우선은 Idle 과 Run 만 이용해 만들어 볼 예정이기 때문에
그래프에 Speed 가 0인 곳에 Idle, 스피드에 500인 곳에 Run 애니메이션을 넣어주었다.

이제 값을 세팅하기 위해 위에 있는 EventGraph 로 넘어가자.

좌측 하단에 있는 My Blueprint 패널에서 VARIABLES 에서 Speed 라는 Float 변수를 하나 생성해준다.


그리고 그 변수를 그래프로 끌고와서 Set Speed 노드를 생성할 수 있다.

이후에 Try Get Pawn Owner 노드로 캐릭터 블루프린트를 가져오고
Get Velocity 로 캐릭터의 속도를 가져온 뒤,
Make Vector 노드와 Vector Length 를 통해 벡터 값에서 스칼라 값만 가져와 Speed 에 값을 대입시킨다.

마지막으로 Is Valid 노드로 캐릭터 블루프린트가 유효한 지에 대해 확인까지 하며 만일의 사태에 대비한다.

이 후에 다시 ABP로 돌아가서 스테이트 머신(State Machine) 을 하나 만들어서 OutPut Pose에 연결해준다.
스테이트 머신은 정지, 걷기, 뛰기 등 여러가지 상태를 한 번에 관리하는 장치다.

스테이트 머신을 더블 클릭하여 들어가서 우클릭을 하면 Add State 로 상태를 추가할 수 있다.

Idle 과 Run 상태를 이런 식으로 이어주고 각 스테이트 노드를 더블 클릭하여 들어가서 설정을 해준다.

Idle 은 Asset Browser 에서 MM_Idle 애니메이션을 가져와 이렇게 연결해주고,

Run 은 블렌드 스페이스를 가져와 속도 값을 적용시켜주고 이렇게 연결해준다.

이제 각 상태의 조건을 설정하기 위해 화살표를 더블 클릭하여 들어가준다.

Idle -> Run 에서의 조건은 Speed 가 0보다 클 때,

Run -> Idle 에서의 조건은 Speed 가 0보다 작거나 같을 때로 설정해준다.

이러면 정지 상태와 달리기 상태의 애니메이션 설정은 끝났다.

이번엔 점프에 관한 애니메이션을 적용시키기 위해서 IsInAir 라는 변수를 Boolean 값으로 하나 추가해줬다.

EventGraph 에서 Get Movement Component 를 통해 캐릭터 무브먼트 컴포넌트를 가져오고,
이 컴포넌트가 Is Falling 을 통해 공중에 떠있는 지에 대한 값을 가져와 IsInAir 변수에 대입시킨 것이다.

그리고 Sequence 노드를 이용해 한 번에 두 가지 작업을 실행할 수 있게 해주었다.

다시 AnimGraph 의 스테이트 머신으로 돌아와 StateAlias 를 만들어주고,
Details 패널로 가서 State Alias > Idle / Run 체크 박스를 활성화 시켜준다.

그리고 새로운 스테이트 3가지 Jump, Fall, Land 를 만들어준다.
각각 점프할 때, 떨어질 때, 착지할 때의 상태이다.

노드의 연결은 이런 식으로 하면 된다.

기본적으로 점프를 한다하면 {정지/달리기 -> 점프 -> 낙하 -> 착지 -> 정지} 순으로 애니메이션이 진행되고,
높은 곳에서 떨어질 때의 상황도 있기에 {정지/달리기 -> 낙하 -> 착지 -> 정지} 순으로도 애니메이션이 진행되게 만들었다.

이제 각각의 스테이트에 알맞는 애니메이션을 넣어준다.

예외적으로 Fall 상태는 떨어질 때 계속 그 애니메이션이 반복되어야 하기 때문에
Details 패널에서 Settings > Loop Animation 을 체크해주어야 한다.

이번엔 조건을 설정할 건데,
Idle/Run -> Jump, Fall 둘다 IsInAir 변수가 True 일 때 작동해야하기 때문에 그대로 넣어준다.

Jump -> Fall 조건은 먼저 화살표를 눌러주고 Details 패널에서 Automatic Rule Based on Sequence Player in State 를 체크해주면 된다.

Jump 애니메이션이 끝나면 자동으로 Fall 이 작동하도록 하는 시스템이다.

Fall -> Land 조건은 IsInAir 변수가 True 에서 False 로 바뀔 때이기 때문에 NOT Boolean 노드를 이용해 연결해준다.

마지막으로 Land -> Idle 조건은 Jump -> Fall 조건과 마찬가지로 착지가 끝나면 정지 상태가 바로 되기때문에 똑같은 방식으로 세팅해주면 된다.

버그 발생

저장을 하고 컴파일을 해준 뒤 테스트를 해봤지만, 점프 후 착지 시 캐릭터가 사라지는 현상이 있었다.

이에 대해 찾아보니 Land 애니메이션의 Asset Details > Additive Settings > Additive Anim Type 이 기본적으로 활성화 되어있었기 때문이었다.

이 기능은 기존 애니메이션에 추가되어 두 애니메이션의 차이를 이용해 모션을 추가하는 방식이라고 하는데, 아직은 무슨 소리인지 잘 이해는 안 간다.

아무튼 Local Space 를 No additive 로 바꾸어 설정해주고 실행하니 잘 작동했다.

3. 테스트 플레이

https://drive.google.com/file/d/1UiR6_bTnJY3WPTM3yBCTBrxTArSpGjMV/view?usp=sharing

정상적으로 잘 작동하는 모습이다.

학습 내용 요약 & 느낀점

이번엔 IA 를 이용해 점프를 구현하고 블렌드 스페이스와 스테이트 머신을 이용해 애니메이션을 적용시켜보았다.

어제는 단순히 이동만 구현했지만, 애니메이션을 적용시키니 게임을 하는 기분이 들었다.
비록 동작이 부자연스럽다는 느낌이 들긴 했지만 지금 단계에서 이 정도 수준이면 충분히 만족스럽다고 느낀다.

0개의 댓글