ecsimsw

Animator 본문

Animator

JinHwan Kim 2019. 2. 2. 04:54

Animation

- 유니티에서 애니메이션 시스템을 다루는 방법을 공부하였다. 유니티는 Mecanim이라는 시스템을 제공하여 애니메이션 설정이나, 애니메이션 클립을 이용, 리타게팅 등 애니메이션을 더 쉽게 다둘 수 있도록 하였다.
  • Animator controller
    - Animator controller는 게임 오브젝트의 애니메이션 상태와 상태 전환을 관리한다. Assets에 우클릭 후 create - Animator Controller 을 통해 생성하고, Animator 컴포넌트의 Controller에대한 인자로 대입하는 것으로 해당 오브젝트의 애니메이션을 관리한다.

  • State Machine
    - 애니메이션의 상태와 상태 간의 전환을 다루기 위해 State Machine을 사용한다. 이는 일종의 플로우차트 또는 Unity에 포함된 비주얼 프로그래밍 언어로, 애니메이션 클립을 레퍼런스하여 각 모션의 순서나 관계를 갖도록한다.
      Asset으로 존재하는 애니메이션 클립을 Animator에 드래그하는 것으로 해당 애니메이션의 노드를 생성하고, 우클릭 후 make transition으로 다음 노드를 설정하는 것으로 모션의 과정을 결정할 수 있다.

      위의 예시로, shoot의 transition을 idle로 설정하는 것으로 총을 쏜 모션 이후의 동작을 대기 상태 동작으로 하는 것으로 애니메이션의 다음 상태를 결정한다.
  • Animation.Play
    - 위 예시는 다음의 스크립트 작성으로 실행된다. 우선 animator controller를 오브젝트의 Animator 컴포넌트로 넣어주고, 스크립트 내에서 이 컴포넌트를 가져와 animator 변수에 담은 후 Play 메소드를 호출한다.
    Animator animator; animator = GetComponent<Animator>(); animator.Play("m_weapon_shoot", -1, 0);
  •   Play 메소드는 controller에 포함된 애니메이션 이벤트 명을 문자열로 받고, Layer, 애니메이션 시작 위치를 파라미터로 한다. layer에서 -1일 경우 첫 state에서 시작하고, 애니메이션을 0~1 까지로 하여 시작 위치를 설정하는 것이다.
    ( 같은 애니메이션이 반복되야 할 경우 단순히 애니메이션 이름만 넘겨주면 한번만 실행되는 문제를 해결할 수 있다. )
    animation.Play("walk", PlayMode.StopAll); animation.Play("walk", PlayMode.StopSameLayer);
      위처럼 Play 메소드의 파라미터로 모드를 줄 수 있는데, StopAll은 현재 진행 중인 모든 애니메이션을, StopSameLayer은 같은 레이어의 다른 애니메이션을 정지시킨다.
  • Animation Parameter
    - Animator Parameter는 애니메이터 컨트롤러에서 정의된 변수로서, 스크립트에서 접근하거나, 애니메이션 자체의 값(ex, speed)을 변경하여 상태 머신을 제어하거나 흐름에 영향을 줄 수 있다.
      이 변수의 타입은 int, float, bool, trigger 4가지이고, Animator 클래스의 함수를 이용하여 스크립트 안에서 파라미터 값을 할당/ 수정 할 수 있다.
    Animator animator; void Start () { animator = GetComponent<Animator>(); } void Update () { float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); bool shoot = Input.GetMouseButtonDown(0); animator.SetFloat("Forward",v); animator.SetFloat("Strafe",h); animator.SetBool("Shoot", shoot); } void OnCollisionEnter(Collision col) { if (col.gameObject.CompareTag("Enemy")) { animator.SetTrigger("Die"); } }

'Etc > Unity' 카테고리의 다른 글

Local Coordinate  (0) 2019.02.04
Vector3  (0) 2019.02.04
Material / Texture  (0) 2019.01.30
Prefab  (0) 2019.01.30
Rigidbody / AddForce / AddTorque  (0) 2019.01.28
Comments