본문 바로가기
Unreal Engine/[UE4] RPG Project

3. C++ 애님 인스턴스, Character 점프기능, Sprint 기능

by JJPearl 2022. 1. 12.
반응형

- 애니메이션 블루프린트 제작

https://jjpearl.tistory.com/39?category=1070610 

 

[UE4 C++] 애니메이션 시스템 (애니메이션 블루프린트)

애니메이션 블루프린트 캐릭터가 다양한 상황에 적절한 애니메이션을 체계적으로 재생하도록 하는 애니메이션 시스템 제작 도구. 애니메이션 블루프린트는 두가지로 구성. 애님 그래프(Anim Grap

jjpearl.tistory.com

데이터를 관리하는 애님 인스턴스를 C++로 작성했다.

애님 인스턴스.h / 현재 Pawn의 speed, 캐릭터 무브먼트 컴포넌트의 IsFalling 값을 저장할 변수 사용중
애님 인스턴스.cpp / 애님 인스턴스의 틱인 NativeUpdateAnimation 함수에서 데이터를 얻는다

* 원래 BlendSpace2D를 사용해 Direction에 따라 애니메이션들을 blend 하려 했었으나

나의 캐릭터는 컨트롤 회전을 따라 이동하고, 메쉬가 움직이는 방향을 따라 돌아가게 하는 

"GetCharacterMovement()->bOrientRotationToMovement = true" 를 사용하고 있기 때문에

Direction을 구하는 의미가 없다. 

그래서 폰의 Speed 값만 이용하는 BlendSpace1D를 사용하였다. 

추후 폰의 Direction 진행방향 각도값을 알고싶을 때 다음 함수를 사용하면 된다.

CalculateDirection(const FVector& Velocity,const FRotation& BaseRotator)

CurrentPawnDir = CalculateDirection(Pawn->GetVelocity(), FRotator(0.0f, Pawn->GetControlRotation().Yaw, 0.0f)); // pawn의 진행방향 구하는 코드

 

 

 

 

 

 

- 캐릭터 점프기능(Space bar) 구현

 1. 플레이어 컨트롤러 : 점프 입력 바인딩 / 점프 구현

점프 입력 설정

 

ACharacter 클래스에는 Jump 멤버함수가 있어 입력과 바인딩 할 수 있다.

이 함수를 Jump입력과 연동하면 바로 캐릭터의 점프 기능이 완성된다.

점프 입력 역시 PlayerController의 SetupInputComponent() 내부에서 바인딩
PlayerController에서 캐릭터의 Jump() 호출하는 함수 구현

 

  • 점프 높이 조절 : GetCharacterMovement()->JumpZVelocity = 450.0f;

 

 

 2. 애님 인스턴스 : 캐릭터 무브먼트 컴포넌트의 IsFalling()

캐릭터가 점프 중 / 땅 위에 있는지 정보를 폰의 무브먼트 컴포넌트에서 얻어올 수 있다.

폰의 무브먼트 컴포넌트는 다음 함수들을 제공하는데 이 기능들을 제대로 구현한건 캐릭터가 사용하는 캐릭터 무브먼트 컴포넌트 뿐이라 캐릭터에서만 사용 가능.

  • IsFalling() : 현재 공중에 떠있는지
  • IsSwimming()
  • IsCrouching() : 현재 쭈그리고 앉아있는지
  • IsMoveOnGround() : 땅 위에서 이동중인지

애님 인스턴스에 해당 값을 저장할 변수를 생성 후 값을 얻어와 애님 그래프에 전달.

 

 

 3. 애니메이션 블루프린트 : 스테이트 머신

점프를 JumpStart,JumpLoop,JumpEnd 스테이트로 나눴다.

해당 스테이트에 알맞는 애니메이션이 각각 없었기 때문에

하나의 점프 애니메이션을 각각의 스테이트에 맞게 잘라서 사용했다.

  • Ground -> JumpStart : IsFalling()이 true일 때
  • JumpStart -> JumpLoop : JumpStart 애니메이션의 남은 재생 시간이 0.1초 미만 일 때
    • TimeRemaining(ratio) 노드는 스테이트 애니메이션의 남은 재생시간을 반환
  • JumpLoop -> JumpEnd : IsFalling()이 false 일 때
  • JumpEnd -> Ground : JumpEnd 애니메이션 남은 재생 시간이 0.45초 미만일 때

 

- 애니메이션 시퀀스 자르기

  1. 잘라서 사용하고 싶은 애니메이션 수 만큼 원본 애니메이션 복제.
  2. 애니메이션 시퀀스 에디터에서 사용하고 싶은 모션의 프레임을 제외하고 타임라인 우클릭 - 시퀀스 편집 - 프레임 ~에서 ~제거를 클릭.
    시퀀스 편집
  3. 편집 후 저장.

 

 

 

 

- 캐릭터 빨리 달리기(Sprint) 기능(shift키) 구현

점프와 마찬가지로 플레이어 컨트롤러에 입력 바인딩해 구현. 

캐릭터의 속력 조정은 GetCharacterMovement()->MaxWalkSpeed 값을 조정하면 된다.

Blend Space와 함께 사용.

반응형