Unity Chapter 9-1. 애니메이션 : 클립, 컨트롤러, FSM, 파라미터

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 9. 유니티 애니메이션

Asstes Store에서 “Unity-Chan!”을 Import 해주었다.


🔔 애니메이션 클립

3D 모델과 애니메이션 클립

image

  • 프리팹에 하얀 네모가 있는 아이콘은 3D 모델이며 재생 마크가 있는 파일은 애니메이션 클립이다.
    • 보통 이렇게 3D 모델 파일(오브젝트)에 애니메이션 클립(컴포넌트)이 달려있도록 구현한다.
  • 오른쪽 아래에 빨간 체크된 사람 아이콘을 클릭하고 Unity Model를 누르면 유니티에서 제공하는 기본 3D 모델로 애니메이션 클립이 재생되는 것을 볼 수 있다.
    • Asset Store에서 애니메이션이 있는 에셋을 임포트 받으면 📂Models 라는 폴더를 가지고 있는데 이 곳에 있는 메인 3D 모델을 애니메이션 클립창에 드래그 앤 드롭하면 이 모델이 적용된 애니메이션 클립을 볼 수 있다.
      • 📂Models의 unitychan 3D모델파일을 클립에 드래그 앤 드롭 해주었다.

애니메이션 클립 만들기

image

  1. 애니메이션의 주체가 될 오브젝트를 하나 만들어준다.
  2. Window - Animation 창을 띄워준다.
  3. 오브젝트를 선택한 상태에서 Animation 창을 보면 Create 버튼이 생기는데 이를 클릭하고 저장하면 애니메이션 클립을 만들 준비가 된다.
  4. 🔴 녹화 버튼을 누른 후
  5. 오브젝트 이리저리 움직이면 그 행위들이 애니메이션으로 녹화가 된다.


🔔 애니메이션 컨트롤러 + FSM

📂Models의 unitychan 3D 모델 파일을(프리팹)을 Hierarchy 창에 드래그 앤 드롭하여 오브젝트화 시켜주자.

  • 3D 모델 파일을(프리팹)을 Hierarchy 창에 드래그 앤 드롭하여 오브젝트화 시키면 Animator 컴포넌트가 기본적으로 붙어있다.
  • 이 Animator 컴포넌트의 Controller에서 애니메이션을 통제한다.
    • 애니메이션 컨트롤러를 만들어 이 슬롯에 드래그 앤 드롭 해주어야 한다.

애니메이터 컨트롤러

  • 애니메이션 컨트롤러 만들기
    • 우클 - Create - Animator Controller
    • 이름은 Character Animator라고 짓고 unitychan오브젝트의 Animator 컴포넌트의 Controller 슬롯에 드래그 앤 드롭 해주었다.
  • Animator Controller애니메이션을 통제하고 제어하는 지도를 가지고 있고 Animator 컴포넌트는 이를 바탕으로 애니메이션을 재생하는 역할을 한다.
    • Animator Controller 👉 에셋
    • Animator 👉 컴포넌트

FSM : Finite State Machine

애니메이션 상태유한한 개수로 존재하며, ⭐한번에 1개의 애니메이션 상태만⭐ 재생할 수 있다. 이러한 시스템을 FSM이라고 하며 유니티는 FSM을 기반으로 한다.

애니메이션 상태(State)는 애니메이션 컨트롤러에서 관리한다. 어떤 상태일 땐 어떤 애니메이션 클립을 재생할지 제어한다.

  • 위에서 만든 Character Animator 애니메이션 컨트롤러를 더블 클릭하면 상태들의 관계도가 나온다.

State

image

  • State 만들기
    • 기본적으로 애니메이션 클립이다.
      • 기존에 가지고 있던 애니메이션 클립을 Animator 창에 드래그 앤 드롭해줄 수도 있고
      • 우클 - Create State - Empty 하여 빈 상태를 만들어준 후 Motion에서 📂Assets에서 해당 상태에 연결할 애니메이션 클립을 선택해 연결해 줄 수도 있다.
  • 유니티 기본 State
    1. Any State
      • 애니메이터가 어떤 애니메이션을 재생하는 상태였건 간에 조건이 만족되면 무조건 다음 상태로 넘어가 애니메이션을 재생하게 한다.
    2. Entry
      • 게임이 시작되면 먼저 이 Entry 상태로 진입함. 여기서부터 시작됨.
    3. Exit
      • 상태가 종료되는 지점
      • 여기에 도달하면 애니메이션 재생이 완전히 끝난다.
  • Default State
    • 게임이 시작되자마자 바로 재생될 상태.
    • 따라서 Entry 상태로부터 연결되어 있음
    • 상태에다가 우클 - Set as Layer Default 하여 디폴트 상태로 설정할 수 있다.

Transition

image

애니메이션에서 A 상태에서 어떤 조건을 만족하면 B 상태가 되도록 상태와 상태를 이어주는 것. 애니메이션 상태가 어떤 방향으로 전이될지를 나타낸다. 화살표로 나타난다.

  • Transition만들기
    • 우클 - Make Transition 하여 이 상태 다음에 재생시킬 상태에 화살표로 이어준다.
Has Exit Time
  • Transition 화살표를 누르고 인스펙터 창을 보면 Has Exit Time이란 것이 기본적으로 체크되어 있다.
    • 이걸 체크해놓은 상태에서 트랜지션에 현재 아무 조건을 주지 않았다면 애니메이션이 Exit Time에 도달할때까지 기다린 후 자동으로 트랜지션에 연결된 다음 상태로 넘어간다.
    • 체크하지 않으면 기다리는 것 없이 애니메이션이 끝나자 마자 바로 넘어가서 빠르다.
    • 아무 조건이 없는 트랜지션인 상태에서 Has Exit Time을 꺼주면 다음 상태로 넘어가는 트랜지션이 자동으로 발동되지 않게 되므로 한 상태가 끝난 상태로 멈춰버린다는 것에 주의하자.

Parameter

image

트랜지션이 실행되는 조건을 만드는데에 사용된다.

  • 파라미터 종류
    • int, float, bool
    • Trigger
      • True가 되는 순간 다시 바로 False가 된다.
  • 조건 만들기
    • 먼저 조건을 설정할 트랜지션을 선택한 후 인스펙터 창의 Condition에서 조건을 만들 수 있다.
    • 추가 버튼을 눌러 조건을 추가한다.

image

  • ex) Walk Forward 상태에서 Idle 상태가 되는 조건은 Speed 값이 0.3 보다 작아지는 것.


🔔 애니메이터 파라미터

C# 스크립트를 통하여 Animator 컴포넌트를 불러온 후 파라미터 값을 수정하라고 명령하자.

  • 현재 Animator 컴포넌트가 붙어있는 unitychan 오브젝트에 📜PlayerController.cs 스크립트를 붙여주자.

📜PlayerController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public Animator anim;
    
    void Update()
    {
        if(Input.GetButtonDown("Jump"))
        {
            anim.SetTrigger("Jump");
        }

        float verticalInput = Input.GetAxis("Vertical");

        anim.SetFloat("Speed", verticalInput);
    }
}
  • public Animator anim
    • 현재 unitychan 오브젝트에 붙어있는 Animator 컴포넌트를 이 슬롯에 넣어주자.
  • Jump 버튼(Space bar)을 누르면 anim.SetTrigger(“Jump”)
    • 애니메이터가 알아서 “Jump” Trigger 파라미터를 발동하게 한다.
    • 이제 그에 맞게 "Jump" Trigger 파라미터가 조건으로 되어있는 트랜지션이 발동하면서 해당 애니메이션이 재생된다.
  • Input.GetAxis(“Vertical”);
    • 위아래 방향키를 누르면 1.0이 리턴되어 verticalInput 값이 1이 된다.
    • 아무것도 안누르면 0.0을 리턴한다.
  • anim.SetFloat(“Speed”, verticalInput);
    • 애니메이터가 알아서 “Speed” float 파라미터를 발동하게 한다.
    • 이제 그에 맞게 "Speed" float 파라미터가 조건으로 되어있는 트랜지션이 발동하면서 해당 애니메이션이 재생된다.
      • 위아래 방향키를 누르면 1이 들어오므로 Speed 값은 1이 되며 예를 들어 Speed 값이 0.3보다 크면 발동되기로 되어있는 조건이 붙은 트랜지션이 활성화 된다.


Any State 활용

어떤 상태였던 간에 Jump상태가 바로 발동되게 하고 싶다면 Any State로부터 Jump로 가는 트랜지션을 만들어 주면 된다. 걷는 상태이던 정지한 상태이던 점프 조건이 만족되면 해당 트랜지션이 발동되도록.

image

  • Any State로부터 Jump상태로 가는 트랜지션을 연결해 준 후 트랜지션 인스펙터 창에서 Condition을 설정해준다.
  • Jump상태에서 또 Jump상태로 트랜지션 할 수 있어 점프 중에도 또 점프를 할 수 있다.
    • 즉, 자기 자신에서 또 자기 자신으로 트랜지션 할 수 있는 것인데
    • 이건 트랜지션에서 Can Transition To Self가 체크되어 있어서 그렇다.


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

맨 위로 이동하기


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

댓글 남기기