Unreal engine 4 게임개발, Sword RPG, 캐릭터 애니메이션 - 3

캐릭터 애니메이션 - 3


이번 포스트에서는 블렌드 스페이스로 애니메이션을 만들고
더 추가하거나 다듬을 게 있는지 생각해보겠습니다.

언리얼 공식 문서를 참고하며 하겠습니다.
http://api.unrealengine.com/KOR/Engine/Animation/Blendspaces/

문서에는
'블렌드 스페이스 (Blend Space) 는 애님 그래프 에서 샘플링할 수 있는 특수 애셋으로, 두 입력값에 따라 애니메이션을 블렌딩시켜 주는 것입니다.' 라고 나와 있습니다...

쉽게 말해 애니메이션을 섞어주는 기능입니다.
예를 들어 저의 캐릭터 어흥이가 전후좌우로 이동한다고 생각해봅시다.
그런데 스테이트 머신에서 단순히 전환하는 식으로만 애니메이션을 구성하면 
뚝뚝 끊기거나 이상하게 재생될 때도 있습니다.

이유는
1. 전후좌우로 각 애니메이션을 전환할 때 그 사이를 메꿀 애니메이션이 없고
2. 대각선으로 움직이는 등 애니메이션에 없는 입력을 할 수 있기 때문입니다.

이 문제를 블렌드 스페이스로 한 번에 해결할 수 있습니다. 
캐릭터의 속력이 느릴 때는 천천히, 빠를 때는 빨리 움직이도록 움직임을 섞어주기도 하고
앞과 옆을 동시에 누르면 대각선으로 이동하는 것처럼 만들어주기도 합니다.
그러면 보다 자연스러운 움직임이 나오겠죠?
일단 한 번 해보겠습니다.


저번에 만들었던 어흥이의 스테이트 머신입니다.
속력에 따라 Idle 과 Jog 간에 전환이 되도록 했었죠.
이제 더 자연스러운 움직임을 위해 블렌드 스페이스를 사용해보겠습니다.


우클릭 - 애니메이션으로 들어가 블렌드 스페이스를 만듭시다.


어떤 스켈레톤을 사용할 지 물어봅니다. 어흥이는 Kwang의 Skeleton을 쓰고 있으니
Kwang_Skeleton으로 합니다.


이름은 '어흥_BS'로 하겠습니다. 더블 클릭해서 창을 엽니다.


열자마자 위와 같은 창이 보입니다. 여기서 작업을 해 애니메이션을 섞을 수 있습니다.
기본 설정부터 해보겠습니다. 왼쪽의 애셋 디테일 창의 Axis Settings를 만지겠습니다.


가로 축 Name은 Direction
Minimum Axis Value 는 -180
Maximum Axis Value 는 180

세로 축 Name은 Speed
Minimum Axis Value 는 600(어흥이의 Max Walk Speed와 같습니다)
Maximum Axis Value 는 0

이렇게 설정을 하면 가운데 아래 창에 그 설정이 반영된 것을 보실 수 있습니다.
Speed은 캐릭터의 속도를, Direction은 캐릭터가 향하는 방향을 의미합니다.

이제 가운데 아래 있는 패널을 사용해보겠습니다. 여기가 애니메이션을 섞는 곳입니다.


오른쪽의 애셋 브라우저에서 애니메이션 Jog_Fwd를 끌어다가
패널의 가운데 맨 위에 놓았습니다(Speed 600, Direction 0)

위의 캡쳐본은 아니지만 Speed 0, Direction 0 에 Idle을 놨다고 가정하고 설명하겠습니다.

Idle은 제 자리에서 건들거리는 애니메이션이고 Jog_Fwd는 앞으로 뛰는 애니메이션입니다.
그런데 건들거리다가 갑자기 앞으로 뛰는 애니메이션이 재생되는 것은
검은색이 갑자기 흰색으로 바뀌는 것과 같습니다.
중간에 짙은 회색, 회색, 옅은 회색 등을 넣어 재생시켜야 색이 서서히 변하는 것처럼 보이겠죠?

마찬가지로 위의 패널을 이용해 애니메이션을 재생하면
W키를 눌렀을 때 멈춰있다가(Idle), 서서히 걷다가(자동으로 섞어만든 Anim), 최고 속력에서는 앞으로 뛰는(Jog_Fwd) 애니메이션이 재생됩니다. 애니메이션이 자연스럽게 섞인겁니다.

이제 옆과 뒤도 애니메이션을 섞어보겠습니다.


Kwang 애니메이션을 세세한 것까지 박박 긁어서 써줘야 자연스럽게 움직일겁니다.

이제 Idle도 놓았고(Speed 0, Direction 0) 뒤로 뛰기, 옆으로 뛰기를 놓았습니다.
(저는 처음에 왼쪽이든 오른쪽이든 180도를 돌면 뒤로 간다는 걸 헷갈려서 좀 헤맸습니다...)여튼 위처럼 구성하면 전후좌우, 어디로 뛰어가든 자연스러운 움직임이 나옵니다.


추가로 Target Weight...어쩌구를 설정해줍니다.
초 당 타깃 웨이트 보간 속도라고 하는데 값을 올리면 전환이 더 빠릿빠릿하게 되며
움직임을 한 층 자연스럽게 만들어 줄 수도 있습니다. 5로 설정하겠습니다.


아까 패널에서 만들었던 축 값 Speed 와 Direction을 실제로 만들어줘야겠죠?
애님 그래프 변수에서 +를 눌러 추가해주고 위처럼 블루프린트를 만듭니다.
그러면 캐릭터의 Speed와 Direction을 담은 Float유형의 변수를 얻을 수 있습니다.


애님 그래프입니다. 아쉽지만 이제 스테이트 머신을 밀어내고 새로운 노드를 연결해줍니다.


우클릭 후 블렌드스페이스 플레이어 '어흥_BS'를 생성해줍니다.
이 노드로 지정된 블렌드 스페이스를 재생할 수 있습니다.


생성 후에는 실제 값을 반영할 수 있게 Speed와 Direction을 연결해줍니다.
그리고 플레이를 누르면....


캐릭터가 상하좌우, 대각선 등 어디로 움직여도 자연스럽습니다!~
이제 정말 게임 캐릭터 같습니다. 아직은 움직임뿐이지만요..

+추가로 연속 공격을 만들어보겠습니다. 지금은 왼쪽 마우스를 아무리 눌러도 올려치기 한 번만 하는데 원래 Kwang은 4연속 때리기가 가능한 캐릭터이더라고요.

저의 어흥이도 클릭하여 최대 4연속으로 공격하도록 만들어보겠습니다.
기존에 있던 Kwang_BlueprintCharacter를 참고했습니다.


우선 Kwang 공격 애니메이션 4개를 우클릭하여
몽타주로 만들고 Animation 폴더에 가져왔습니다.


원래 어흥이의 공격 방식을 구현한 블루프린트입니다.
이것을 포함해 여러 가지를 바꿀 건데 작업한 결과물을 먼저 한 번에 나열하겠습니다.


캐릭터 블루프린트에 만든 연속 공격 블루프린트입니다.
공격스택저장(Boolean)과 공격카운트(Integer), 인티저에 따른 스위치 등을 추가했습니다.
헷갈리니 연속 공격 관련 이미지를 몇 개 더 올린 뒤 정리하도록 하겠습니다.


노티파이 2개를 만들었습니다. 이름은 각각 '저장스택공격' 과 '콤보초기화+공격끝'입니다.


그 노티파이들로 캐릭터 블루프린트에 있는 커스텀 이벤트를 
발동시키는 기능을 만들었습니다.
하나는 '콤보 리셋'이고 다른 하나는 '저장한 것으로 공격'입니다.
이제 이것들이 어떤 원리로 연속 공격을 구현하는지 정리해보겠습니다.

헷갈리실까봐 말씀드리는데
캐릭터 블루프린트에 있는 Boolean 변수의 이름이 공격스택저장,
몽타주에 있는 노티파이의 이름과 Anim_BP에 있는 이벤트 이름이 저장스택공격입니다.


일단 왼쪽 마우스를 한 번만 클릭했다고 가정합시다.
첫 공격 시에는 (점프는 안했다 치고) '공격중?'이 False이므로
위의 순서의 결과로 몽타주 Attack_A가 재생됩니다.
그럼 재생된 Attack_A의 몽타주를 보겠습니다.

현재
공격중? True
공격스택저장 False
공격카운트 1


맨 위부터 차례대로
Attack_A 몽타주의 노티파이,
애니메이션 블루프린트,
캐릭터 블루프린트입니다.

이 아래부터는 색깔로 구분을 해놓겠습니다.

Attack_A가 재생되는 동안에, 즉 첫 공격을 하는 동안에 마우스 클릭을 하지 않고
노란색으로 표시된 '콤보초기화+공격끝' 노티파이를 넘어간다면
해당 노티파이의 이벤트가 발동하며 위와 같은 원리로 콤보 리셋이 됩니다.

현재
공격중? False
공격스택저장 False
공격카운트 0

같은 원리로 Attack_B나 C 까지 연속 공격을 했어도 마우스 클릭을 못한 채 
해당 노티파이를 넘어가버리면 콤보가 리셋되겠죠. 
연속 공격을 하려면 첫 공격부터 다시 시작해야할겁니다.

현재
공격중? False
공격스택저장 False
공격카운트 0

연속 공격을 실패하는 상황을 하나 설명드렸습니다.


다시 마우스 클릭을 한 번 했다고 생각하겠습니다.

현재
공격중? True
공격스택저장 False
공격카운트 1

'공격중?'이 True인 이 상황에서
이 때 플레이어가 집중해서 '콤보 초기화+공격끝' 노티파이를 넘어가기 전
마우스 클릭을 다시 한 번 하면 조건에 따라 두 가지 상황이 만들어집니다.


------------------------------------------------------------------------------------

조건 1

몽타주 노티파이에서 프레임이 빨간색 영역에 있는 동안에 마우스 클릭을 한다.
(저장스택공격을 넘어가기 전에 마우스 클릭을 한다.)


결과

Attack_B가 재생됩니다. 연속 공격 성공!

원리

'공격중?'이 True이므로 조건 1에서 한 마우스 클릭이 '공격스택저장'을 True로 만듭니다.

현재
공격중? True
공격스택저장 True
공격카운트 1

그 후 프레임이 저장공격스택 노티파이에 도달하면 
저장스택공격이 발동하고 연쇄적으로 저장한 것으로 공격을 발동시킵니다.
그러면 공격스택저장이 False로 바뀌며
공격카운트가 1이기 때문에 핀 1이 실행되어 공격카운트가 2가 됩니다.
마지막으로 애님 몽타주 Attack_B가 재생됩니다. 연속 공격에 성공한겁니다!!

현재
공격중? True
공격스택저장 False
공격카운트 2

아까 마우스 클릭을 한 번만 했을때와 공격카운트만 달라졌습니다.
이제 몽타주 Attack_B가 재생되는 동안 저장스택공격 전에만 마우스를 누른다면
같은 방식으로 Attack_C가 재생될겁니다. 
Attack_D는 발동 전에 공격카운트를 초기화시키기 때문에 
마우스를 제때 눌러도 다시 Attack_A가 재생될겁니다.

조건 2

몽타주 노티파이에서 프레임이 주황색 영역에 있는 동안에 마우스 클릭을 한다.
(프레임이 두 노티파이 사이에 있을 때 마우스 클릭을 한다.)


결과

잠시 공격스택저장이 True가 되지만 연속 공격은 실패합니다.

원리

'공격중?'이 True이므로 조건 2에서 한 마우스 클릭이 '공격스택저장'을 True로 만듭니다.

현재
공격중? True
공격스택저장 True
공격카운트 1

이렇게만 보면 조건 1과 같습니다만
프레임이 이미 저장스택공격을 지나가버렸기 때문에 
저장한 것으로 공격이 발동되지 않습니다. 공격스택저장을 헛으로 쌓은거죠.

이렇게 헛으로 쌓은 공격스택저장과 더불어 공격중?, 공격카운트 
모두 노티파이 '콤보초기화+공격끝'에 의해 리셋됩니다ㅠㅠ 
마우스 클릭을 제때 하면 이런 일이 안 일어나겠죠?

현재
공격중? False
공격스택저장 False
공격카운트 0
---------------------------------------------------------------------------------------------------

그러니까 저장스택공격을 넘어가기 전에만 마우스를 클릭하면 연속 공격을 할 수 있었네요.
(각 애님 몽타주의 저장스택공격을 더 앞으로 당기고 마우스를 우다다 클릭하면 더 빠르게 공격할 수 있습니다...)

이 연속 공격 부분을 이렇게 구구절절 써놓은 이유는 사실 제가 헷갈리기 때문입니다.
앞으로도 헷갈리거나 어려운 부분이 있으면 하나하나 기록하면서 하려 합니다..

화려한 연타 공격을 선보이는 어흥이...!

이렇게 캐릭터 애니메이션을 만들어봤습니다.
추가로 보완할 점이 생각나면 기존 포스트를 갱신하며 기록하겠습니다.
랜드스케이프나 캐릭터 구성하기도요.

여태까지는 포스트를 매일 올렸습니다만
이제부터는 좀 복잡하기 때문에
저도 알아보고 정리해야해서 매일 올리진 못할 것 같습니다.

다음 포스트에서는 예정대로 아이템과 인벤토리를 만들어보겠습니다.

댓글