Script를 정의하기전에 알아두어야 할 것.
스크립트에서는 Animator컴포넌트를 가져와서 애니메이션 작업을 합니다. 이러한 가정하에 애니메이션 작업을 하기 위에선 다음과 같은 전제가 필요합니다.
- 매카님 애니메이션을 사용하기 위해서는 Animator 컴포넌트가 필요하다.
또한, 애니메이션을 활용하기 위해서, 애니메이션을 위한 자료형이 필요하다는것을 인식하여야 합니다. Animator를 제어하기 위해서는 다음과 같은 자료형들이 필요합니다.
- static int : Animator의 상태값을 저장하기 위한 자료형입니다. 실시간으로 저장하는 것이 아닌, 애니메이션의 상태가 어떠한 것이 있는지 읽어오는 변수로 활용합니다.
- AnimatorStateInfo : Aniamtor의 레이어를 실시간으로 바로바로 읽어오는 역할을 합니다. 어온 레이어의 애니메이션이 어떤 상태를 하고 있는지등을 알 수 있습니다
(적어놓을때는 파란 키워드로 색을 바꿔놓았지만, 실제로 모노디벨롭에서는 자료형이 파란색으로 따로 뜨지는 않습니다)
애니메이션에 자료형이 필요하듯이, Animator를 제어하는데 필요한 함수들도 몇개 있습니다.
- Animator.StringToHash("애니메이터레이어.애니메이션이름") : int 형으로 애니메이션 상태값을 반환하는 함수입니다. 인자값을 한글로 해줬지만,
스크립팅 작업시에는 반드시 Animator 안에 영어여야 합니다. 또한 애니메이션의 이름은 문자열로 읽긴 하지만 이름을 정의할때 가능하면 변수와 같이 이름을 정의하는게 좋습니다. 가령
- 애니메이션의 상태값의 이름은 반드시 영어여야 한다.
- 애니메이션의 상태값의 이름에는 공백이 들어가서는 안된다.
- 애니메이션의 상태값의 첫글자는 숫자를 대입하면 안된다.
와 같은 규칙을 지켜주시면 좋습니다.
- 애니메이터컴포넌트변수.GetBool(int id);
- 애니메이터컴포넌트변수.GetInteger(int id);
- 애니메이터컴포넌트변수.GetFloat(int id);
- 애니메이터컴포넌트변수.GetVector(int id);
이 함수들은 Animator 안에 있는 변수들을 그대로 스크립트로 읽어오는데에 쓰입니다. 리턴형은 함수의 이름에 포함되어 있는 이름과 일치합니다.
또한 인자로 int id 라고 되어있지만, 애니메이터 안에 있는 변수의 이름을 문자열로 읽어오면 됩니다.
가령 Animator 안에 bool 형의 Move 라는 이름의 변수가 선언되어있다면 다음과 같이 가져올 수 있습니다.
private Animator mAnimator;
void Awake()
{
mAnimator = GetComponent<Animator>();
bool isMove = mAnimator.GetBool("Move");
}
마찬가지로, Animator 안에 있는 변수들 안에 스크립트 내부에서 선언한 값들을 대입하는 함수도 존재합니다.
mAnimator.SetBool( int id, bool value );
mAnimator.SetFloat( int id, float value );
mAnimator.SetInteger( int id, int value);
mAnimator.SetVector(int id, Vector3 value);
첫번째 인자는 애니메이터 안에 정의된 변수의 이름을 문자열로 넘겨주면 되고, 두번째 인자는 함수의 이름에 정의된 자료형을 넘겨주면 됩니다.
마찬가지로 함수에 있는 이름은 대입하는 자료형의 이름과 같습니다.
이것들 외에도 애니메이션에 접근하는 변수와 함수는 많습니다만, 그것들은 레퍼런스를 참고하시길 바랍니다.
1.간단한 걷기 동작의 애니메이션을 적용해봅시다.
이곳에서는 간단하게 걷기 동작을 해보는 스크립트를 작성해보려고 합니다. 일단 작성하려는 스크립트의 목적은
1. 가만히 있으면 IdleAnimation 을 재생합니다.
2. WASD를 누르면 이동하는 애니메이션으로 바뀌면서 이동합니다.
3. 다시 입력을 멈추면 원래대로 돌아오는 애니메이션을 적용합니다.
입니다.
일단 스크립트의 작성에 앞서, 다음과 같은 작업을 해줍니다.
1. 적용할 모델링에 Animator 컴포넌트를 추가합니다.
2. 추가한 모델링에 Avatar 컴포넌트를 만들어둡니다.
3. AnimatorConroller를 추가하여, Idle애니메이션과, Walk 애니메이션의 상태를 만들어주고 이것들을 서로 Transition으로 이어줍니다.
4. AnimatorConroller 의 내무에 Bool 형 변수를 하나 추가하여, Move라는 이름으로 명명합니다.
5. Idle, Walk애니메이션을 잇는 트랜지션에 조건을 줍니다. Move가 참일경우 Walk로 넘어가고, 거짓일 경우 다시 Idle로 가도록 말이죠.
이렇게 하면 간단한 애니메이션을 하는 작업은 끝났습니다.
스크립트는 다음과 같은 작업을 해주시면 됩니다.
using UnityEngine;
using System.Collections;
public class AnimationTest : MonoBehaviour
{
private Animator mAnimator;
void Awake()
{
mAnimator = GetComponent<Animator>();
}
void Update ()
{
bool IsMove = Input.GetAxis("Horizontal") != 0 || Input.GetAxis("Vertical") != 0;
mAnimator.SetBool("AnimationMove", IsMove);
}
}