본문 바로가기
공부/Unity

Unity Animation

by Piva 2021. 3. 22.

  동아리 스터디를 통해 자료조사 한 내용을 백업.

  Notion에서 쓴 걸 옮겨오는 거라 중간중간 이상한 부분 있을 수 있음...


Unity의 Animation

Animator 컴포넌트

- GameObject에 Animation을 할당하기 위해 사용함.

- Animator Controller에 대한 참조가 필요함.

 

  • Animation Controller
    : Animation 클립들과 Animation Transition을 조정하여 Animation을 다양한 방법으로 재생될 수 있게 함.
  • Animation Transition
    : 애니메이션의 전환, 각 애니메이션이 전환되는 사이에 필요한 기간 및 전환 조건 등을 정의함.

Animation Controller

기본 화면

  • Parameters (Event Parameters Widget)
    : 스크립트를 통해 접근하고 할당될 수 있는 변수. 스크립트로 State Machine의 흐름을 제어할 수 있게 해줌.
    - Bool, Float, Integer, Trigger 형식의 변수를 선언할 수 있음.
    - 각각의 타입의 변수는 스크립트에서 SetFloat, SetInteger, SetBool, SetTrigger, ResetTrigger 등을 통해 제어할 수 있음.
  • Layers (Animation Layers)
    : 각각의 다른 파츠에 대해 복잡한 State Machine을 제어할 때 사용. (아마 머리, 몸, 팔, 다리 등으로 부위가 나뉜 경우를 말하는 듯)

Inspector (Animation)

 

Animation을 선택했을 때의 Inspector

  • Loop Time : Animation이 재생된 후 계속 루프할 것인지를 결정함. 체크를 해제하면 Animation이 한 번 재생된 후 다시 재생되지 않음.

State Machine

  • States : 캐릭터가 취할 수 있는 액션. (걷기, 달리기 등...)
  • State Transitions : 현재 상태에서 캐릭터가 넘어갈 수 있는 다음 상태에 대한 옵션.
    → 각 상태와 전환, 현재 상태를 기억하기 위한 변수가 합쳐져 State Machine 을 구성.
    States, Transitions, Events 로 구성.

Animation States

: Animation State Machine의 기본 블록.
캐릭터가 해당 상태에 있을 때 재생할 애니메이션을 가짐.

State를 선택했을 때의 Inspector

  • Speed : 기본 속도.
  • Motion : 해당 상태에서 재생할 애니메이션.
  • Transitions : 해당 상태에서부터 파생된 Transitions들.

* 아래의 3가지의 상태는 기본적으로 존재하는 상태들.

  1. Any State (모든 상태)
    : 현재의 상태와는 상관 없이 특정 조건을 만족하면 해당 상태로 이동할 때 사용. Animation State Machine내의 모든 상태에 대해 동일한 전환을 추가할 때 사용함. 단, '전환의 끝'에 위치하는 것은 불가능.

   2. Entry : 시작 상태. 애니메이션에 처음 진입했을 때의 시점.

   3. Exit : 종료 상태. 모든 상태가 종료되는 시점.

 

Animation Transitions

특정 Transition을 선택했을 때의 Inspector

(각 Transition에 대해서는 이름을 설정해줄 수 있음.)

  • Has Exit Time : 캐릭터가 다른 State로 변화하여도 현재 재생 중인 애니메이션이 끝날 때까지 유지.
  • Conditions : 전환이 일어날 조건의 설정.

  이하는 스샷에 없는 Settings 내의 설정들.

Property 기능
Exit Time Has Exit Time이 활성화되어있을 경우, 애니메이션의 전환이 실행될 시간을 나타냄.
ex) 0.5로 설정되어있을 경우, 전환 조건이 만족 되더라도 현재 재생중인 애니메이션이 최소 50%는 재생되어야 전환이 이루어짐.
Fixed Duration Fixed Duration이 활성화되어있을 경우, 전환 시간을 초 단위로 나타냄.
Transition Duration 두 애니메이션(전환 전과 후)이 겹치는 정도. (0 ~ 1 사이 값)
Transition Offset 애니메이션의 재생 시간을 정의. (0 ~ 1 사이 값)
Interruption Source 애니메이션 전환이 중단되는 상황의 제어에 사용.
(참고: https://jinhomang.tistory.com/116)

 


  이하는 기존 에셋의 구조를 분석&활용해본 예시.

 

사용 에셋 : Brackeys 2D Mega Pack
(https://assetstore.unity.com/packages/2d/free-2d-mega-pack-177430)

  • 사용한 Sprite : BlobPlayer_Blue
  • 전체 Sprite

 

  • BlobPlayer_Blue.controller 의 구성

  1. Idle : Player가 아무 동작도 하지 않을 때의 기본 애니메이션.
  2. Walk : Player가 걸어다닐 때의 애니메이션.
  3. Jump : Player가 위로 점프할 때의 애니메이션.
  4. Land : Player가 점프한 뒤 착지할 때의 애니메이션.
  • BlobPlayer_Blue 에 애니메이션 적용

선언 변수 내역

  1. Walking : Player가 지면 위에서 이동 중인지 나타냄.
  2. Jumping : Player가 점프 중인지 나타냄.
  3. Landing : Player가 착지 중인지(공중에서 아래로 하강하는 중인지) 나타냄.
  4. onGround : Player가 지면 위에 있는지 나타냄.

Transition을 연결한 모습

//PlayerController.cs
/*
	private Animator ani;
	ani = GetComponent<Animator>();
*/

if (rigidBody.velocity.normalized.x == 0)
        {
						//Player가 멈췄을 때
            ani.SetBool("Walking", false);
        }
        else
        {
						//Player가 이동할 때
            ani.SetBool("Walking", true);
        }


if (rigidBody.velocity.y < 0)
        {
						//점프 직후 하강할 때
            ani.SetBool("Landing", true);
        }
        else if (rigidBody.velocity.y == 0)
        {
						//하강 후 지면에 착지했을 때
            ani.SetBool("Landing", false);
            ani.SetBool("onGround", true);
        }

if (Input.GetButtonDown("Jump") && onGround) {
						//점프 시
            rigidBody.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
            ani.SetBool("Jumping", true);
            onGround = false;
        }

void OnCollisionEnter2D(Collision2D col)
    {
        if (col.gameObject.tag == "Ground")
        {
						//지면에 착지 시
            ani.SetBool("Jumping", false);
            onGround = true;
        }
    }

 

참고

'공부 > Unity' 카테고리의 다른 글

Raycast & LayerMask (쪼까 추가  (0) 2021.04.18
Tilemap (feat. World Building)  (0) 2021.04.09
Input 정리  (0) 2021.03.12