스파르타내일배움-unreal

[스파르타코딩클럽] 애니메이션 블루 프린트와 블렌드 스페이스

ye0n-j 2025. 5. 15. 19:13

* 애니메이션 블루 프린트 적용하는 방법

* 블렌드 스페이스를 애니메이션에 적용하는 방법

* state Machine


캐릭터에 애니메이션을 적용해서 자연스럽게 움직이는 형식을 만들어본다.

[애니메이션] - [애니메이션 블루프린트] 생성

애니메이션 블루프린트와 캐릭터 블루프린트 같은 에셋을 사용한 블루 프린트가 2가지로 생성이 된다.

 

애니메이션 블루프린트와 블루프린트의 다른 점

- 블루프린트 -> 뷰포트, 이벤트 그래프가 존재한다

- 애니메이션 블루포인트 -> AnimGraph(어떤 이벤트를 쓰는지에 대해서 세팅함), 이벤트 그래프가 존재

 

아무것도 설정 안되어 있을 때의 상태

AnimGraph에서 A_Bot_Idle을 가져와 Output pose랑 연결하여 컴파일

위의 A_Bot_Idle 모션이 적용된 상태

 

다만 애니메이션이 게임에도 적용이 되기 위해서는 블루 프린트에도 적용이 되어야 한다.

블루프린트에 애니메이션을 적용하려면 블루프린트에서 생성한 애니메이션 블루포인트를 삽입해야 한다.

왼쪽 상단 BP_Character(셀프) 선택 후 디테일에서 애님 클래스에서 선택할 애니메이션 블루프린트 적용

모션에 사용되는 에셋은 다음의 종류가 있다

초록색 - 애니메이션 시퀀스 타입

주황색 - 블렌드 스페이스 타입

보라색 - 몽타주

 

몽타주와 애니메이션 시퀀스는 생성되는 모양은 같지만 색이나 기능 자체가 다르다.

몽타주는 여러 개의 모션이 들어가는 것이 가능하지만 시퀀스는 단일 모션이 들어간다 그리고 재생 구간별로 편집을 해서 합칠 수 있다.

 

달리기와 점프 모션도 추가해보도록 한다.

속도에 따라서 뛰거나 걷는 모션을 적용하기 위해서는 블렌드 스페이스를 통해 적용하면 된다.
* 블렌드 스페이스 : 여러 개의 애니메이션을 섞어서 자연스럽게 보여주는 것

새로운 폴더를 생성하여 그 안에 블렌드 스페이스를 생성하도록 한다. 

[애니메이션] - [블렌드 스페이스] 를 생성한다. (에셋은 동일하게 SK_Bot)
생성한 블렌드 스페이스가 애니메이션 블루프린트의 에셋 브라우저에 나타난다.

 

Axis Setting에서 가로축은 사용하지 않고 세로축 값만 변경한다.

우리는 속도가 달라질 때 모션이 달라질 수 있도록 할 것이기 때문에 세로축 이름을 Speed 로 정한다.

Y축의 가장 상위는 Run 에셋이 오도록, 가장 하위는 Idle 에셋이 오도록 배치한다.
command 키를 누르면서 마우스를 움직이면 프리뷰로 모션이 어떻게 움직이는지 확인된다. 

저장하고 애니메이션 블루 프린트로 돌아가자.

생성했던 RunWalk 블렌드 스페이스를 Output Pose와 연결한다. 다만 속도값에 따라 모션이 달라지는데에 비해서 받아올 속도 값이 없기 때문에 수정이 필요하다. 우선 변수를 생성한다. (Speed-플로트 변수 생성)

Get Speed 하여 Speed와 연결

이벤트 그래프에서 스피드 설정을 진행한다.

1. Set Speed - Set Speed로 들어오는 값을 변경 시켜준다.

2. Event BlueprintUpdateAnimation  - 애니메이션이 변경될 때마다 이벤트가 실행이 된다.

3. Try Get Pawn Owner - 애니메이션이 적용된 폰의 정보를 가져온다.

4. Get Velocity - 폰의 속도를 가져온다 (Try Get Pawn Owner와 연결), 속도 중 상하좌우의 속도인 X,Y만 사용한다. (Z는 사용하지 않음)

5. X랑 Y값만 사용한 벡터를 사용할 것. 벡터는 방향성을 띄고 있는 속도. 스칼라 값은 그 힘의 크기만 나타내고 벡터는 힘의 크기와 방향을 같이 가지고 있다.

6. make Vector 를 Get Velocity 와 연결 

7. Vector Length - 벡터의 값은 크기와 방향을 가지고 있음, 벡터의 힘의 크기, 스칼라 값을 가져오기 위해서 길이만 가져온다. 
(벡터의 길이 = 스칼라 값). (Make Vector와 연결) (Return Value 는 Set Speed 와 연결)

8. ? Is Valid - 프로그래밍을 할 때는 방어장치가 있어야 한다. 예상할 수 없는 상황이 발생하여 유효한지 아닌지 체크하기 위해 설정해둔다.


점프를 구현하기 전에 스테이트 머신이라는 것에 대해서 알아야 한다.

StateMachine = State + Machine

* State : 시스템(또는 객체)이 현재 어떤 조건에 놓여 있는지를 뜻한다

* Machine : 이벤트에 따라 내부적으로 작동하거나 변환이 일어나는 장치

소프트웨어, 게임 개발, 전자 회로 설계 등 다양한 분야에서 '정해진 여러 상태 중 하나에 있으면서 특정 입력이나 사건(Event)에 의해 다른 상태로 전이(Transition)한다'라는 모델을 가리킬 때 사용합니다.

간단히 말에서 상태에 따라서 하는 행동이 변한다는 말로 압축 시킬 수 있다.

ex1 ) 신호등

빨간불, 초록불, 황색불 이라는 정해진 '상태'들이 있고 시간이 흐르거나 센서가 감지되는 '이벤트'에 의해 다음 상태로 넘어간다.

 

ex2 ) 자판기

'동전 없음', '동전 투입됨','음료 선택', '거스름돈 지급' 같은 일련의 상태들이 있으며 사용자의 선택 버튼이나 동전 투입이라는 입력(이벤트)에 따라 다른 상태로 바뀐다.

 

AnimGraph에서 State Machine 생성

 

state machine

트랜지션 룰 : 스테이트 머신에서 사용되는 조건

Idle state

Run state

 

Idle -> Run 트랜지션 룰

speed 변수가 0보다 크면 달린다 라는 조건

greater를 사용해 0보다 크면 움직일 수 있게끔 설정한다

 

Run -> Idle 트랜지션 룰

Speed 변수가 0과 같거나 0보다 작으면 멈춘다는 조건

less equal 을 사용하여 0과 같거나 작아지면 Idel 상태가 될 수 있도록 설정한다.


점프와 관련된 이벤트 그래프 설정

9. IsInAir 변수 - 부울 생성

10. Set IsInAir 추가 

11. Get Movement Component - 블루프린트의 캐릭터 무브먼트 컴포넌트 값을 가져온다

12. Is Falling - 떨어지고 있는지 아닌지의 값과 Get Movement Componet 연결, Return Value는 Set IsInAir와 연결

13. Sequence를 통해 두 개의 동작을 수행하게끔 진행한다. 시퀀스에 따라서 Pawn Owner가 유효하다면 동작을 하게 되는데 첫번째는 속도가 변경되고 두번째는 공중에 있는지 아닌지를 확인하게 된다.

 

점프가 추가되었으므로 state Machine 들도 새로 추가되어야 한다.

1. 스테이트 에일리언스 추가 (Idle/Run) - 에일리언스 : 두가지의 상태를 대신 처리해줄 수 있다. 

2. 스테이트 추가 (Jump, Fall, Land)

3. Jump 스테이트에 애니메이션 시퀀스 추가 - A_Bot_IdleJump

4. Fall 스테이트에 애니메이션 시퀀스 추가 - A_Bot_Fall

fall의 경우에는 계속해서 떨어지는 경우일때 행동이 반복되어져야하므로 애니메이션 루프를 체크해야만 한다.

5. Land 스테이트에 애니메이션 시퀀스 추가 - A_Bot_LandIdl

6. 트랜지션 룰 수정

-1. IsInAir가 true인 경우에 점프하거나 떨어지는 상태일 것이다 (땅에 붙어있는 상태가 false)

 

Idle/Run -> Jump

Idle/Run -> Fall

Jump -> Fall

스테이트의 시퀀스 플레이어에 따른 자동 규칙 체크 : 애니메이션 끝나면 자동으로 Fall 로 넘긴다는 뜻

 

Fall -> Land

IsInAir 변수와 NotBoolean 연결

True값이 되면 착지가 된다라고 설정해두는 값이다.

Land -> Idle

땅에 발을 디디면 다시 Idle 형태로 돌아가게끔 한다. 해당 설정도 자동으로 되게끔 지정한다.