UE4 Chapter 3-5. 플레이어 캐릭터 : 애니메이션 블루프린팅

Date:     Updated:

카테고리:

태그:

인프런에 있는 황대희님의 언리얼 엔진4 3D 횡스크롤 게임 만들기 강의를 듣고 정리한 필기입니다. 😀
언리얼 엔진 공식 문서 https://docs.unrealengine.com/ko/index.html


Chapter 3. 플레이어 캐릭터

🔔 애니메이션 블루프린팅

애니메이션 블루프린팅 추가하기

  • 애니메이션 블루프린트 “CharAnimBP”를 추가 image
    • ‘Animinstance’ 선택 + 사용하고자 하는 3D 모델을 뼈대로 선택
      • image


애니메이션 블루프린팅 적용하기

“MoveCharBP” 액터(캐릭터)에 애니메이션을 적용할 것이기 때문에, "MoveCharBP"의 Animation 컴포넌트에 위에서 추가한 애니메이션 블루프린트인 "CharAnimBP"를 적용해주어야 "MoveCharBP" 캐릭터에 블루프린팅한 애니메이션이 적용된다. Anim Class에서 “CharAnimBP” 애니메이션 블루프린트를 설정해준다.

image


🔔 기본 이동 애니메이션

애니메이션 블루프린트의 애님 그래프(Anim Graph)

image

이 애님 그래프에다가 에셋 브라우저로부터 원하는 애니메이션 모델을 그대로 드래그 해서 레퍼런스 노드로 옮겨주어도 되지만 애니메이션 상태, 순서를 나타낼 State Machine을 추가해준다.(New State Machine) 그리고 이를 최종 애니메이션 포즈의 Result와 연결해준다.

상태 머신 (State Machine)

image

  • 애니메이션 파일 추가는 에셋 브라우저에서 가져와 드래그 앤 드롭해주면 된다.
    • 캐릭터가 정지해 있을 때 애니메이션 👉 “sword_and_shield_idle” 애니메이션 파일
    • 캐릭터가 이동하는 중일 때 애니메이션 👉 “sword_and_shield_run” 애니메이션 파일
  • Entry
    • 애니메이션 시작은 정지 애니메이션으로.
  • Transition
    • 정지 애니메이션 👉 뛰는 애니메이션 으로 전이되는 조건
      • 이 애니메이션을 가진 액터의 속도가 0.1 이상이면 뛰는 애니메이션으로 전환한다.
        • image
        • Get Owining Actor 노드
          • 이 애니메이션 블루프린트(Animinstance)를 소유하고 있는 액터를 리턴한다. “MoveCharBP” 캐릭터가 됨.
        • Get Velocity 노드
          • 액터의 속도를 Vector3 로 리턴한다.
        • Vector Length 노드
          • Vector3 의 스칼라 float 크기를 리턴한다.
        • float >= float 노드
          • 0.1 을 입력해준다.
    • 뛰는 애니메이션 👉 정지 애니메이션 으로 전이되는 조건
      • 이 애니메이션을 가진 액터의 속도가 0.1 미만이면 정지 애니메이션으로 전환한다.
        • image
  • 컴파일

Root Motion

루트 모션 👉 스켈레톤의 루트 본의 애니메이션을 기준으로 하는 캐릭터의 동작

위까지 한 후 실행하면 뛰는 애니메이션이 버벅거리며 움직인다. 그 이유는 뛰는 애니메이션 파일인 “sword_and_shield_run” 모델 파일이 Root Motion이 활성화 되어 있기 때문에 캐릭터의 동작이 스크립트(블루프린팅) 기준이 아닌 애니메이션을 기준으로 하기 때문이다. “sword_and_shield_run”을 열어서 애니메이션을 확인해보면 애니메이션 자체가 제자리에서 모션을 하는게 아니라 앞으로 뛰어 가는 모션인이라 실제 이동이 있는 애니메이션이다. 그래서 애니메이션 기준으로 위치와 그에 기반한 속도를 계산했던 것 때문에 버벅거리는 것 처럼 보였던 것이다. 따라서 블루 프린트 스크립팅을 기준으로 하기 위해 루트 모션을 해제해줄 것이다.

image

  • Force Root Lock 을 체크해주어 루트 모션을 잠근다.
  • Root Motion Root Lock을 Anim First Frame으로 해준다.
    • 애니메이션 첫 프레임의 루트 본 위치 사용.
  • 컴파일

유니티 루트 모션 설명 참고


🔔 공격 애니메이션

애님 몽타주

  • 정지와 이동 애니메이션을 상태 머신으로 구현한 이유
    • 이 애니메이션은 어떤 조건 동안 자신의 애니메이션 클립을 온전히 처음부터 끝까지 실행한다. 즉, 애니메이션 클립을 세부적으로 통제하거나 제어할 필요는 없음
    • 애니메이션끼리의 어떤 순서, Transition이 필요하기 때문에 (정지👉이동 / 정지👈이동) 상태 머신이 필요했다.
  • 공격 애니메이션은 애님 몽타주로 실행시키는 이유
    • 타 애니메이션과 연결되는 애니메이션이 아님.
    • 보통 공격 시행 때 딱 한번씩만 실행 됨
    • 공격 도중에는 또 공격 애니메이션을 다시 재생하지 못하게 한다던가, 공격을 하면 데미지 처리를 한다던가 등등 세부적인 통제와 제어가 필요하기 때문이다.
  • 해당 애니메이션 클립을 몽타주로 만들면 세부적으로 애니메이션을 제어하기 쉽다.
    • 특정 애니메이션의 일부분만 반복 재생이나 일부만 재생한다던가 또는 여러 애니메이션들을 조합해서 재생한다던가 애니메이션 특정 프레임에서 이벤트가 발생하게 하거나 여러 애니메이션 시퀀스를 묶는 등등 세부적인 처리가 가능해진다.
    • 애니메이션 블루프린트의 이벤트 그래프에서 애니메이션 재생도 가능하도록 해줌

몽타주 만들기

  • 콘텐츠 브라우저에서 공격 애니메이션으로 사용할 “sword_and_shield_slash” 애니메이션 파일에 우클 - 생성 - 애님 몽타주 를 클릭하면 이 애니메이션의 몽타주를 생성할 수 있다. 이름은 “sword_and_shield_slash_Montage”가 된다.
  • 모두 저장

애님 몽타주에 대한 더 자세한 설명은 이 블로그언리얼 공식 문서를 참고하자. 아래 에도 계속해서 애님 몽타주에 대한 설명이 등장하니 읽어보자.


좌클릭시 공격

왼쪽 마우스 클릭을 하면 공격 애니메이션이 실행되도록 할 것이다.

🚩 “MoveCharBP”의 이벤트 그래프

image

  • 왼쪽 마우스 버튼을 클릭하는 이벤트가 발생하면
  • Play Anim Montage
    • 공격 애니메이션을 재생시킬 애님 몽타주를 재생시킨다.
      • Anim Montage에 위에서 만든 “sword_and_shield_slash_Montage” 몽타주를 할당한다.

🚩 “CharAnimBP” 애님 그래프

image

이렇게 애님 몽타주를 꼭 ! ! ! 반드시 ! ! ! 그룹으로서 추가하여 애님 그래프에 최종 애니메이션 포즈와 연결지어주어야 애니메이션이 적용된다

  • "DefaultSlot" 슬롯 그룹
    • Slot은 몽타주 내에서 애니메이션을 몇이든 담을 수 있는 트랙이다.
      • 몽타주는 여러 애니메이션 클립을 조합하여 재생할 수 있다고 위에서 언급했다.
    • GroupSlot들의 모음이다. 그룹 당 하나의 몽타주만 재생이 가능하다.
    • 현재 “sword_and_shield_slash_Montage” 몽타주의 슬롯들이 모여 있는 그룹 이름은 “DefaultSlot”으로 되어 있다. 따라서 이 그룹을 애님 그래프에 추가한다는 것은 곧 “sword_and_shield_slash_Montage” 몽타주, 즉 공격 애니메이션을 재생시키겠다는 것이다.
  • 상태 머신 👉 "DefaultSlot" 슬롯 👉 최종 애니메이션
    • 최종 애니메이션에 가깝게 배정된 애니메이션일 수록 상위에서 덮어 씌운다.
      • 따라서 이동, 정지 애니메이션 상태를 담고 있는 상태 머신을 공격 애니메이션을 다루는 “DefaultSlot” 슬롯이 덮어 씌운다. 공격 애니메이션을 재생해야할 때가 발생하면 이동, 정지 애니메이션은 덮어지는 셈이다. 공격 애니메이션이 더 우선적으로 재생된다.


이미 공격 중이라면 공격 애니메이션을 또 재생하지 않도록 하기

공격 중 인지를 나타내는 Boolean 타입의 isAttcking 변수가 True면 공격 애니메이션을 재생하지 않고, False일 때만 공격 애니메이션을 재생하도록 한다. 그리고 공격 애니메이션 재생이 끝나갈 때쯤엔 다시 isAttcking 변수를 False로 다시 만들어 주어야 다시 공격 애니메이션을 재생할 수 있다.

🚩 “sword_and_shield_slash_Montage” 몽타주

image

  • 노티파이 👉 애니메이션 재생 시간의 특정 지점에 이벤트를 발생시킨다.
    • 끝 즈음인 40프레임 즈음에 “OnAnimEnd_Attack” 라는 이름의 노티파이를 추가해주었다.
    • 이제 애니메이션이 재생되다가 저 프레임에 다다르면 “OnAnimEnd_Attack” 이벤트가 실행될 것이다.
  • cf) 위 사진을 보면 “sword_and_shield_slash” 애니메이션 클립이 이 몽타주의 DefaultGroup 그룹 내의 DefaultSlot 슬롯 내에서 처음부터 끝까지 재생되는 것을 볼 수있다.
    • 이 경우엔 한 클립이 처음부터 끝까지 재생되도록 했지만 몽타주는 여러 애니메이션 클립을 조합해서 재생할 수도 있는만큼 한 슬롯에 있어 다양한 애니메이션 클립을 조합해 재생할 수 있다. 한 슬롯은 여러개의 애니메이션 클립으로 조합될 수 있다.
      • 예를 들어 재장전 애니메이션을 하는 몽타주(=그룹)라면
        • 재장전 그룹
          • 서서 재장전 할 때의 슬롯
            • 재장전 시작 애니메이션 재생 - 재장전 루프 애니메이션 반복 재생 - 재장전 완료 애니메이션 재생
          • 엎드려서 재장전 할 때의 슬롯
            • 재장전 시작 애니메이션 재생 - 엎드렸을 때의 재장전 애니메이션 재생 - 재장전 완료 애니메이션 재생

🚩 “MoveCharBP”의 이벤트 그래프

image

  • isAttacking이라는 변수를 추가해준다.
    • 공격 중인지를 True/False로 나타낼 booleadn 변수
  • 왼쪽 마우스 버튼을 클릭하는 이벤트가 발생하면
    • isAttacking이 False 일때 isAttacking을 True로 바꿔준다. (체크 해줌) 이어서 Play Anim Montage 공격 애니메이션을 재생시킬 애님 몽타주를 재생시킨다.
  • OnAnimEnd_Attack 이벤트가 발생하면 isAttacking을 False로 바꿔준다. (체크 해제)
    • 몽타주에서 애니메이션 끝 프레임 즈음에 발생하도록 정의한 OnAnimEnd_Attack 이벤트를 이렇게 “MoveCharBP”의 블루프린트 노드에 이벤트로서 추가해준다.
    • 📢 이때의 OnAnimEnd_Attack 노드는 커스텀 이벤트로, 노티파이에서 추가해준 OnAnimEnd_Attack 이벤트는 아니다. 별개의 존재이다!! 이름을 똑같이 지었을 뿐.
      • 아래 “CharAnimBP”의 이벤트 그래프에서 직접 노티파이로 추가했던 그! OnAnimEnd_Attack 이벤트가 발생하면 “MoveCharBP”의 커스텀 이벤트인 OnAnimEnd_Attack를 발생시킬 수 있도록 할 것이다.

🚩 “CharAnimBP”의 이벤트 그래프 (애님 그래프 ❌)

image

  • “MoveCharBP”의 OnAnimEnd_Attack 커스텀 이벤트를 발생시키기 위한 작업.
    • “sword_and_shield_slash_Montage” 몽타주는 애니메이션 블루프린트인 “CharAnimBP”에 직접적으로 소속되어 있기 때문에 노티파이로 추가했던 그 OnAnimEnd_Attack 이벤트를 발생시키려면 “CharAnimBP”의 이벤트 그래프에서 작업을 해야 한다.
  • AnimNotify_OnAnimEnd_Attack 이벤트가 발생하면
    • 노티파이로 추가했던 그 OnAnimEnd_Attack 이벤트
  • “MoveCharBP”의 커스텀 이벤트 OnAnimEndAttack를 발생시킨다.
    • Try Get Pawn Owner로 이 애니메이션 블루프린트를 가지고 있는 폰을 리턴한다.
      • “MoveCharBP”는 캐릭터 유형으로 폰 유형이기도 함.
      • “MoveCharBP”를 폰으로서 리턴함
    • MoveCharBP 에 형변환
      • 입력으로 들어온 Object를 “MoveCharBP”타입으로 형변환
    • On Anim End Attack
      • “MoveCharBP”의 커스텀 이벤트 OnAnimEndAttack를 발생시키는 함수 호출.
      • 타겟은 “MoveCharBP”가 되야 하므로 MoveCharBP 에 형변환의 As Move Char BP를 타겟에 연결한다.


공격 중엔 이동할 수 없도록 하기

🚩 “MoveCharBP”의 이벤트 그래프

image

isAttacking이 False일 때만 Move 할 수 있다.


🔔 점프 애니메이션

점프 기능 구현

스페이스바를 누르면 “MoveCharBP” 캐릭터가 점프하게 해보자.

🚩 “MoveCharBP”의 이벤트 그래프

image

  • 스페이스바를 누르는 이벤트가 발생하면
    • 캐릭터인 “MoveCharBP”(self)가 Jump 한다.
  • 스페이스바를 떼는 이벤트가 발생하면
    • 캐릭터인 “MoveCharBP”(self)가 Stop Jumping 한다.

🚩 “MoveCharBP”의 디테일 패널

  • Character Movement: Jumping/Falling 컴포넌트
    • Jump Z Velocity
      • 뛰는 속도. 값이 크면 클수록 더 높이 뛴다.
      • 값을 1000으로 하여 더 높이 뛰도록 하였다.
    • Air Control
      • 공중에서 캐릭터를 움직일 수 있는 정도
      • 0.3 으로 높여주었다.
  • Character Movement (General Settings) 컴포넌트
    • Gravity Scale
      • 중력 크기. 1.0 이면 보통의 중력 가속도.
      • 2.0 으로 높게 설정하여 덜 높게 뛰고 더 빠르게 떨어질 수 있도록 하였다.


점프 애니메이션 입히기

  • 몽타주 만들기
    • 콘텐츠 브라우저에서 점프 애니메이션으로 사용할 “sword_and_shield_jump” 애니메이션 파일에 우클 - 생성 - 애님 몽타주 를 클릭하면 이 애니메이션의 몽타주를 생성할 수 있다. 이름은 “sword_and_shield_jump_Montage”가 된다.
    • 모두 저장
  • 루트 모션 끄기 👉 이 점프 애니메이션 클립도 앞으로 튀어나가는 모양의 애니메이션이여서 루트 무션 끄는게 자연스럽다.
    • “sword_and_shield_jump” 애니메이션 파일 열기
    • Root Motion
      • Force Root Lock 을 체크해주어 루트 모션을 잠근다.
      • Root Motion Root Lock을 Ref Pose으로 해준다.
        • 레퍼런스 포즈의 루트 본 위치 사용.
  • 컴파일


점프 애니메이션을 길게 늘려보자.

점프 애니메이션 클립 시간이 너무 짧아서 점프 중인데도 또 다시 점프 애니메이션이 계속 반복 재생된다. 따라서 점프 중에 점프 애니메이션이 한번만 이루어지도록 점프 애니메이션 재생 시간을 늘렸다.

🚩 “sword_and_shield_jump_Montage” 몽타주

image

Slot에 있는 “sword_and_shield_jump” 클립을 클릭하고 끝시간을 1000정도로 늘렸다.


땅에 닿으면 점프 애니메이션 중지

점프 애니메이션을 길게 늘리니, 점프가 끝나고 땅에 착지해도 점프 애니메이션 상태로 있게 된다. 따라서 땋에 닿으면 점프 애니메이션이 중지되도록 했다.

🚩 “MoveCharBP”의 이벤트 그래프

image

  • 스페이스바를 누르는 이벤트가 발생하면 “sword_and_shield_jump_Montage” 몽타주를 재생한다.
    • Play Anim Montage
    • 재생할 Anim Montage 에서 선택해주기
  • 캐릭터가 땅에 착지하는 이벤트가 (On Landed이벤트) 발생하면 더 이상 점프 중이 아니므로 “sword_and_shield_jump_Montage” 몽타주 재생을 멈춘다.
    • Stop Anim Montage
      • 멈출 Anim Montage 에서 선택해주기


이미 점프 중이면 또 점프 하지 않도록, 공격 중일 땐 점프 하지 않도록.

🚩 “MoveCharBP”의 이벤트 그래프

image

떨어지는 중이 아니거나 공격중이지 않을 때만 점프가 가능하다. isFalling은 타겟으로 할당된 캐릭터가 낙하중이면 True 아니면 False 리턴하는 함수다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

UE4 Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기