ABOUT ME

Trust your instincts!

Today
Yesterday
Total
  • Unity 2D 애니메이션 공부
    Unity 2021. 3. 20. 21:06

    이번주도 저번주처럼 유튜브와 Unity 공식 문서를 보면서 공부해본 애니메이션...

    사실 여태 만들었던 2개의 게임 중 하나에만 애니메이션이 들어가있었고, 그 마저도 다른 팀원이 해줘서 부끄럽게도 애니메이션 관련해서 잘 아는 편이 아니었다. 분명 예전에 튜토리얼 따라해보면서 배우긴 했지만 많이 까먹었기에 복습할 겸 정리해두려 한다. 

     

    1. StateMachine

    현재 사용한 에셋에는 idle(대기상태), walk, jump이렇게 3가지의 애니메이션이 번갈아 동작된다. 가만히 있다가 점프 / 걷기가 가능하고 걷다가 점프도 가능해서 삼각형모양으로 transition이 그려진다. 

    AnyState의 경우 공식문서를 읽어보니 항상 존재하는 state로 현재 어느 state에 존재하는지와 상관없이 다른 특정 state로 뛰어넘을 수 있게 만들어주는 state이다. 그렇기에 anystate로 가거나 할 순 없고, 약간 goto문같은 느낌으로 사용되는 듯 하다. 

    주황색으로 칠해진 Idle은 디폴트 스테이트이다. Entry(진입)에서 디폴트 스테이트를 향해 트랜지션하는것이 기본이고 Exit는 스테이트 머신을 빠져나오는데 사용한다. 

     

    2. Animation Parameter 

    애니메이션 컨트롤러 내에 정의된 변수로 스크립트 상에서 값의 할당 / 접근이 가능하다. 아래 사진의 2가지 값은 전부 Bool타입의 변수로 현재 걷고 있는가?와 점프중인가? 이렇게 2가지가 있다. 

     

     

    parameter에는 bool값만 있는게 아니고 int, float, trigger 이렇게 3종류가 더 있어서 총 4종류의 parameter가 있다. 스크립트에서는 Animator클래스의 SetBool, SetInt, SetFloat, SetTrigger, ResetTrigger등의 함수로 접근이 가능하다. 이 매개변수들은 상태를 바꾸는데 (ex idle -> walk)필요한 변수들이다. 

     

    아래는 유니티 다큐멘테이션에서 가지고 온 코드 예제이다. (근데 번역체가 완벽하게 깔끔하진 않다 / 주석 몇 개는 내가 넣은거)

    docs.unity3d.com/kr/530/Manual/AnimationParameters.html

     

    유니티 - 매뉴얼: 애니메이션 파라미터

    스테이트 머신 기초 스테이트 머신 트랜지션 애니메이션 파라미터 애니메이션 파라미터는 애니메이션 컨트롤러 내에서 정의된 변수로서, 스크립트를 통해 값을 할당하거나 접근할 수 있습니다

    docs.unity3d.com

    using UnityEngine;
    using System.Collections;
    
    public class SimplePlayer : MonoBehaviour {
        
        Animator animator;
        void Start () {
            animator = GetComponent<Animator>();
        }
        
        void Update () {
            float h = Input.GetAxis("Horizontal"); // horizontal방향 움직임(화살표 좌우)
            float v = Input.GetAxis("Vertical"); //vertical방향 움직임(화살표 위아래)
            bool fire = Input.GetButtonDown("Fire1"); //임의로 유저가 지정한 키값인듯
    
            animator.SetFloat("Forward",v);
            animator.SetFloat("Strafe",h);
            animator.SetBool("Fire", fire); 
        }
    
        void OnCollisionEnter(Collision col) {
            if (col.gameObject.CompareTag("Enemy"))
            {
                animator.SetTrigger("Die");
            }
        }
    }

    +) SetFloat나 SetTrigger같은 경우 매개변수 형태를 다양하게 쓸 수 있는것 같다. ID를 전달하거나 변수 이름을 전달하거나 등등...! 

     

    골드메탈님 유튜브보고 따라한 코드는 이렇다 (일부만 발췌해옴)

     if(Input.GetButtonDown("Jump") && animator.GetBool("isJumping") == false)
            {
                rigid.AddForce(Vector2.up * jumpSpeed, ForceMode2D.Impulse);
                animator.SetBool("isJumping", true);
            }
    
            //Animator 
            if(Mathf.Abs(rigid.velocity.x) < 0.3) //횡이동 속도 0.3보다 작으면 멈춘 상태로 간주,Idle로 전환
            {
                animator.SetBool("isWalking", false);
            }
            else //움직이고 있는 상태
            {
                animator.SetBool("isWalking", true);
            }

    기존에는 이중점프를 방지하게 하기 위해서 지금 점프중인가? 라는 걸 bool타입의 isJump 변수를 생성해서 땅과 충돌하면 false로 바꾸고 다시 점프 가능하게 해주었다. isJump가 false이고, Jump키가 눌렸을때만 점프가능하게 했었는데, 애니메이션 컨트롤러의 불리언값 isJumping을 불러와서 얘가 false면 점프하게 만들어주었다. 

    animator.getBool("isJumping");

    * Animator클래스의 getBool을 이용하면 매개변수로 전달한 변수의 값을 가져올 수 있다. 

    참고로 땅에 닿았을때는 아래 코드처럼 bool값을 false로 만들어주어 다시 점프를 재개할 수 있게끔 만들어주었다. 

    private void OnCollisionEnter2D(Collision2D collision)
        {
            if(collision.gameObject.tag == "Land")
            {
                animator.SetBool("isJumping", false);
            }
        }

     

    3. Transition inspector 

    예시로 가져온 jump -> idle transition

    Transition은 애니메이션 상태를 옮겨가는 통로를 의미한다. Animator창에서 화살표(transition)을 클릭하면 inspector창에 위와 같은 여러 세팅들이 나온다. 하나씩 차례대로 찾아봤다. 

     

    * HasExitTime

    애니메이션이 전환될때 지금 실행중인 애니메이션이 끝날때까지 기다려줄것인가? 를 의미

    0~1사이 값을 가진다. 0은 하나도 기다리지 않는 것, 1은 끝까지 기다려 주는것을 의미한다. 

     

    * Transition Duration

    애니메이션이 넘어가는데 얼마나 시간을 줄것인가? 

    0~1사이 값을 가진다. 0이면 상태전이가 바로 일어남, 1을 주면 매우 천천히 일어남 0.5는 한 50퍼센트정도 실행되다 기다려주는 정도를 나타낸다. 

     

    * Transition Offset 

    애니메이션이 어디서부터 실행될지 결정

    이 값을 늘릴경우 애니메이션이 그만큼 뒤에서 실행된다. (이미지가 더 편할것 같아서 캡쳐해왔음)

     

    idle 애니메이션이 반(0.5) 잘리고 실행된다

    * Interruption Source 

    언제 애니메이션을 중단시킬 수 있는가? 

    None, CurrentState, next State, current state then next state, next state then current state가 있음 

    공식 문서에서 캡쳐해온 설명..!

     

    * Ordered Interruption 

    현재 전환이 순서와 관계없이 다른 전환에 의해 중단될 수 있는지 여부

    +) 체크해두면 전환이 순서와 관계없이 중단됨에 따라 혼선이 일어날 수도 있으니 사용에 주의가 필요하다는 말도 있음

     

    * Conditions 

    이 transition이 언제 일어나는지 조건을 설정할 수 있다. 아래 이미지는 jump->idle이므로 walking과 jumping불리언 변수 모두가 false여야한다. 

    참고로 조건이 아무것도 없으면 ExitTime만 고려한다. 그래서 Exit Time이 0인데 Conditions가 없는 상태라면 유니티 에디터에서 warning을 띄워준다. 

     

    여기까지 기본적인 것들을 공부해봤다. 더 알게 되는게 있으면 차차 추가할 예정..!

     

    * 공부하는데 참고한 자료들(접은글)

    더보기

     

    'Unity' 카테고리의 다른 글

Designed by Tistory.