Unity Animation

선비Sunbei·2023년 1월 20일
0

Unity

목록 보기
10/18
post-thumbnail
post-custom-banner

애니메이션 관련 컴포넌트는 총 2가지 있다.
1. 레거시 애니메이션으로 Animation Component를 붙이면 되고, 예전에 사용하던 방식으로 최근에는 사용하지 않는다. 단지 호환성 문제로 아직 존재한다.
2. 메카님 애니메이션으로 Animator Component를 붙이면 되며, 지금부터 설명할 애니메이션 방식이다.

Models에 보면 UnityChan Avatar 라는 파일이 있을 것이다. 이는 리깅 파일이다. 이를 통해서 아바틀 움직이는 방식이다.

Animator 컴포넌트를 보면 Avatar에 붙일 수 있는 것을 볼 수 있다.
이러한 Avatar의 유형을 유지시키면 비슷한 유형의 캐릭터는 하나의 애니메이션 파일로 모두 적용시킬 수 있다는 장점이 존재한다.

Controller를 클릭하면 이미 만들어져있는 AnimatorController가 있는데 이를 새로 만들 것이다.

Project에서 Create->Animator Ctroller를 선택할 수 있다.
여기서 볼 수 있듯이 Animator는 Component이고, Animatior Controller는 에셋이다.

그럼 다음과 같이 더블 클릭 시 열 수 있다.
Entry는 시작했을 때 접근 할 것을 연결시켜주면 되고, Any State는 어느 상태든 상관없이 조건에 따라 즉시 전이가 가능하다.
Exit는 애니메이터가 종료되는 시점이다. 현재 상태가 Exit으로 갈 시 Animator Controller가 끝난다.

에디터를 사용하는 방법은 Alt+드래그를 통해서 이동할 수 있다. 혹은 중간 키를 누르고 움직여도 된다.

Animation 에셋을 에딧창에 올리고 Entry를 연결하고, 아해와같이 Controller를 연결 시 해당 애니메이션을 재생할 것이다.

Animation 노드는 Motion으로 Animation 에셋을 연결하기 때문에 이름을 변경해도 문제없다.

방법1. 애니메이션 노드를 코드로 실행하는 방법

다음과 같이 만든 후, 이제 마우스 클릭 시 달리게끔 만들어보겠다. Player.cs 파일을 열고


    private Animator mAnimator;
        void Start()
    {
        Manager.Instance.mInputManager.mKeyboard += OnKeyEvnet;
        Manager.Instance.mInputManager.mMouse += OnMouseEvnet;
        mAnimator = GetComponent<Animator>();
    }
    
        void Update()
    {
        if (!mFinDest)
        {
            Vector3 vec = mPosition - transform.position;
            if (vec.magnitude <= 0.001)
            {
                mFinDest = true;
            }
            else
            {
                if (vec.magnitude - Time.deltaTime * mSpeed >= 0)
                    transform.position += vec.normalized * Time.deltaTime * mSpeed;
                else
                    transform.position += vec.normalized * vec.magnitude;

                transform.LookAt(mPosition);
            }
            mAnimator.Play("RUN");
        }
        else
            mAnimator.Play("WAIT");
    	}
	}

다음과 같이 Animation 노드의 이름을 통해서 코드로 실행시킬 수도 있다.
하지만 다음과 같이하면 두 애니메이션 간의 변경이 끊키는 느낌이 있다.

방법2. Blend를 이용한 방식

이를 Blend를 통해서 해결하고 한다.


만든 노드를 더블 클릭하면 더 자세한 설정이 가능해진다.

그리고 우클릭을 통해서 Motion을 추가할 수 있다.

inspector 창을 통해서 모션을 연결할 수 있다.

기본 Blend 변수는 삭제하고 Float 변수를 만들어줬다.

그리고 Blend를 더블클릭으로 들어간 후 Inspector 창에서 변수를 Ratio로 지정해준다.

   private float ratio=1;

    void Update()
    {
        if (!mFinDest)
        {
            Vector3 vec = mPosition - transform.position;
            if (vec.magnitude <= 0.001)
            {
                mFinDest = true;
            }
            else
            {
                if (vec.magnitude - Time.deltaTime * mSpeed >= 0)
                    transform.position += vec.normalized * Time.deltaTime * mSpeed;
                else
                    transform.position += vec.normalized * vec.magnitude;

                transform.LookAt(mPosition);
            }
            ratio = Mathf.Lerp(ratio, 0, 10 * Time.deltaTime); // 0에 가까우면 달리기
        }
        else
            ratio = Mathf.Lerp(ratio, 1, 10 * Time.deltaTime); // 1에 가까우면 멈춤
        mAnimator.SetFloat("Ratio", ratio);
            }
	}

그리고 Player.cs 파일을 SetFloat과 Math.Lerp를 이용해서 더 부드럽게 만들 수 있다.
하지만 이러한 방법은 매 애니메이션마다 모두 만들어야되서 기하급수적인 작업이 필요하다는 단점이 있다.

방법3. State Machine을 이용한 방법


Animation Controller Asset을 좀 더 이용한 방법으로
다음과 같이 Transition을 연결해줬다. 그리고 Transition을 눌러서 Inspector 창을 봐보자.

그럼 다음과 같이 Setting에 블렌딩을 해준다.
Has Exit Time은 체크 시 애니메이션이 끝나면 다음 애니메이션으로 넘어가는 것이고, 언체크 시 바로 변한다.

그리고 WAIT의 Inspector 창을 보면 Transitions에 Transition들이 나타난다.
그리고 높이 있는 것이 더 높은 우선순위를 가져서 WAIT이 끝나면 RUN으로 애니메이션이 바뀐다.

다시 Transition을 눌러서 보면 맨 아래 Conditions가 있다. 이는 조건이 만족하면 Transition을 하라는 것이다.
즉, 이를 이용하면 Transition에서 자동으로 blend를 해주고, 우리는 코드 상에서 Conditions를 이용하여 변수만 설정해줘도 자동으로 다음 애니메이션이 자연스럽게 진행된다.

4. KeyFrame Animation(Animation 파일 만들기)을 이용한 방법

캐릭터 애니메이션의 경우 Animation 파일을 만드는 것이 좋지만, 모든 애니메이션을 애니메티어가 만들 수 없다.
그래서 영화 편집기에서 키 프레임을 몇 개 만들면 보간을 통해서 애니메이션을 실행하게끔 만들 수 있다.
이는 캐릭터의 움직임보다는 간단한 애니메이션에 적합하다.

Window->Animation->Animation을 선택하면 된다.

해당 창이 뜨면 하이러키 창에 오브젝트를 선택 후 Create 해주면 된다.
그럼 Animation 파일인 anim이 만들어지고, 다음과 같이 창이 뜬다.

AddProperty를 이용해서 각 컴포넌트를 animation 효과를 줄 수 있다.

우클릭 시 Add Key를 통해서 키 프레임을 만들 수 있다.

++) Animation 이벤트

Add Key 위에 Line을 누를 시 Add Animation Event를 만들 수 있다.

그럼 체크 포인트가 생길 것이고, Inspector 창을 보면 다음과 같이 특정 애니메이션 시점에 함수를 호출할 수 있다.
이는 특정 애니메이션 시점에 소리를 낼 수 있다. ex> 뛸 때 발걸음 소리

Animation 이벤트를 Function으로 받을 때는 인자에 따라서 여러 함수가 있을 수 있을텐데, 그 중 가장 먼저 받는 함수만 실행된다는 특징이 있다.

post-custom-banner

0개의 댓글