Unity - Animation

이승덱·2021년 12월 28일
0

UnityEngine

목록 보기
10/11

Unity - Animation

  • 플레이어, 몬스터등의 오브젝트들의 모션을 나타내는 기능.
  • 애니메이션은 타입이 있는데 Humanoid타입은 인간형 모델에게만 적용된다.
  • animation컴포넌트와 animator 컴포넌트가 있는데, animation컴포넌트는 구버전에 주로 사용되고 현재는 animator을 주로 사용한다.
  • 애니메이션은 모션을 캡처한 파일이다. animationController를 사용하여 모션 캡처를 적절히 재생시키는 것이 우리가 게임에서 볼 수 있는 캐릭터 애니메이션이다.
  • 코드를 통해 동적으로 애니메이션을 실행, 변경, 중지 하도록 구현한다.
  • Blending기능을 통해 한 애니메이션에서 다음 애니메이션으로 변경될 때 자연스럽게 하기위해, 혹은 현재 진행중인 애니메이션에 새로운 애니메이션을 섞어서 실행하고자 할 때 사용한다.
// 뛰거나 가만히 있는 모션을 블렌딩
        Animator anim = GetComponent<Animator>();
        if (_moveToDest)
        {
            wait_run_ratio = Mathf.Lerp(wait_run_ratio, 1, 10.0f * Time.deltaTime);
            anim.SetFloat("wait_run_ratio", wait_run_ratio);
            anim.Play("Wait_Run");
        }
        else
        {
            wait_run_ratio = Mathf.Lerp(wait_run_ratio, 0, 10.0f * Time.deltaTime);
            anim.SetFloat("wait_run_ratio", wait_run_ratio);
            anim.Play("Wait_Run");
        }
  • 이런 방법으로 프로그래머가 코드로 하나하나 if-else문을 통해 블렌딩을 하는 것은 소규모 게임에서는 가능하지만 대규모 게임의 경우 무리가 있다.

  • State 패턴을 사용하면 이러한 문제를 해결할 수 있다.


    public enum PlayerState
    {
        Die,
        Moving,
        Idle,
    }


    PlayerState _state = PlayerState.Idle;

    void UpdateIdle() 
    {
        // Idle 로직
    }
    void UpdateMoving() 
    {
        // 움직이는 로직
    }
    void UpdateDie() 
    {
        // 죽음
    }


    void Update()
    {

        switch(_state)
        {
            case PlayerState.Idle:
                UpdateIdle();
                break;
            case PlayerState.Moving:
                UpdateMoving();
                break;
            case PlayerState.Die:
                UpdateDie();
                break;
        }
    }
  • 이 방법을 이용하면 if-else문을 사용할 때보다 코드가 깔끔해진다. 하지만 동시에 두가지 상태를 갖는 경우를 구현할 때는 까다로워질 가능성이 있으므로 적절히 사용해야한다.
  • 다만 조건이 복잡할 경우 유니티가 제공해주는 애니메이션 툴을 사용하는 것이 코드를 통해 상태를 제어하는 것 보다 용이하다
  • Has Exit Time : 애니메이션이 끝날 경우 빠져나오는 옵션. 해제할 경우 현재 애니메이션이 반복된다(Loop가 체크 됐을 경우).
  • 애니메이션 툴의 파라미터를 코드와 공유하여 State를 통제한다.
profile
공부 기록용 블로그입니다

0개의 댓글