본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 55. 블랜드스페이스를 통해 에너미의 속도에 따른 애니메이션 구현하기


목차

  1. 블랜드 스페이스 만들기
  2. 에너미 속도 구하기
  3. 에너미가 이동할때 바라보는 방향 조절하기

1. 블랜드 스페이스를 이용해 에너미의 이동 애니메이션 구현하기

 

애니메이션 블루프린트에서 캐릭터의 속도를 구하고 그때마다 적절한 애니메이션을 연결 시켜주어 걷기와 정지 애니메이션을 구현할 수도 있지만 이번에는 블랜드 스페이스를 이용해 이것들을 구분해보려고 한다.

 

 

속도 하나의 값만 가지고 애니메이션을 혼합할 것이기 때문에 1D 블랜드 스페이스로 만들어주자.

 

 

블랜드 작업은 이전 포스팅에서도 해봤으니 간단하게 하게 포스팅해보려고 한다.

 

 

최대 축 크기는 300 (에너미의 최대 속도)로 한다.

 

 

그리고 애니메이션들을 적절히 배치하자. Idle, Walk, Run 순으로 배치하였다. Walk의 경우 120의 값에 배치하였다. 나중에 에너미의 걷기를 구현할때 속도를 120으로 정하거나 아니면 반대로 걷기 속도를 임의 값으로 지정해주고 애니메이션도 그에 맞게 배치하면 될 것이다.

 

이제 이 블랜드 스페이스를 사용해보자.

 

 

현재 이렇게 Idle 애니메이션만 사용하고 있는데 이제 블랜드 스페이스를 사용할 것이다.

 

이렇게 바꾸어주자. 이제 스피드를 알아야 애니메이션을 블랜드 할 수 있을 것이다. 이 값을 어떻게 알려주면 좋을까?


2. 에너미 속도 구하기

 

애니메이션 블루프린트 이벤트 그래프로 들어가보자.

 

 

현재 BP_Enemy 를 Enemy 변수에 저장하고 있다. 이를 통해 캐릭터 무브먼트 컴포넌트를 가져오자.

 

 

블루프린트로 가져올때 캐릭터 무브먼트 컴포넌트가 아니라 그냥 캐릭터 무브먼트였다. 이부분은 조금 조심해야할 듯하다. 이제 이것을 변수로 승격하자.

 

 

이제 지상 속도를 저장할 변수를 만들자.

 

 

실수형 변수가 될 것이다. 이제 속도를 구할 차례이다.

 

현재 에너미는 쓰레드를 이용해 데스포즈를 구하고 있었다. 이곳에서 속도를 구하도록 하겠다.

 

 

쓰레드로 들어가 Property Access를 만들어주자

 

캐릭터 무브먼트 컴포넌트에서 속도 백터를 얻을 수 있다.

 

그리고 이를 통해 백터의 크기를 구하자.

 

 

그리고 우리가 방금 만들었었던 Ground Speed 변수에 저장해주면 된다.

 

그리고 애님 그래프로 돌아가,

 

스피드를 연결해주면 된다. 이제 컴파일하고 잘 작동하는지 확인하자.

 

 

이동 중 애니메이션이 재생되고 잠깐 부딪힌 순간 애니메이션이 변경되는 것을 볼 수 있다. 또한 멈추게 되면 Idle 애니메이션이 재생된다.


3. 에너미가 이동할때 바라보는 방향 조절하기

 

현재는 상관없지만 에너미가 캐릭터를 쫒아다닐때 생길 수 있는 문제점이 있다. 에너미가 항상 캐릭터를 쳐다봐서 회전을 할때 옆으로 걸으면서 회전을 하는 일이 생길 수 있다.

 

에너미가 항상 캐릭터를 쳐다보는 것이 아닌 본인이 진행하는 방향을 바라보게 할 것이다.

 

에너미 블루프린트 클래스로 들어가자.

 

 

캐릭터 무브먼트 컴포넌트를 클릭하고,

 

 

Orient Rotation to Movement 항목을 체크해준다.

 

 

그다음 에너미 클래스 그 자체를 클릭하고,

 

 

Use Controller Rotation Yaw 를 체크를 해제해준다.

 

이제 이것들을 기본 C++ 클래스에서도 설정하도록 하자. 그렇게 하지 않으면 에너미 클래스를 만들때마다 이러한 설정을 반복해야 할것이다.

 

비주얼 스튜디오로 들어가자.

 

에너미의 생성자로 들어간다.

 

#include "GameFramework/CharacterMovementComponent.h"

AEnemy::AEnemy()
{

// 생략

GetCharacterMovement()->bOrientRotationToMovement = true;
bUseControllerRotationPitch = false;
bUseControllerRotationRoll = false;
bUseControllerRotationYaw = false;

}

 

 

이렇게 해서 에너미의 이동 애니메이션 구현이 끝났다. 사실 당연하게도 디테일한 구현을 위해서는 블랜드 스페이스로 정지 동작에서 뛰기 동작까지 전부 구현하는 것보다는 정지 동작과 걷기(뛰기) 동작은 따로 구분하는게 더 좋다.

 

하지만 정말 세세하게 따질 필요없이 효율적인 작업을 원한다면 이렇게 블랜드 스페이스를 이용해 한번에 정하는 것도 좋을 수 있을 거라 생각한다.