Unity 애니메이션 시스템은 Unity의 가장 작은 개념인 Animation Clip 개념에 기반하고 있으며, 특정 오브젝트의 포지션과 각도, 기타 프로퍼티가 시간이 지남에 따라 어떻게 변화해야 하는지에 대한 정보를 포함하고 있다.
가타부타 할 것 없이.. 바로 예제를 살펴 보자.
애니메이션 폴더를 만들고 (Asset -> Animation)
Animation 파일을 만들어 Animation Clip을 생성한다.
그러면 1차적으로 Animation을 만들기 위한 기초 작업은 다 끝난다.
(Loop Time은 반복해서 실행 할 것인지를 선택하는 것)
Animation Clip을 Drag&Drop으로 아래와 같이 sprite에 끌어 놓는다.
-> Unity는 Drag&Drop으로 오브젝트 간의 관계나 참조를 지정할 수 있어 굉장히 직관적이다.
이제.. Controller가 생긴 것을 확인 할 수 있다.
-> Controller : Animation을 제어 하는 것 (ex : 일반 상태/점프할 때/공격할 때 어떤 애니메이션을 써라) [이것도 실제로는 절차도 UI로 되어 있어 직관적임..]
-> Animation : 실제 동작 파일
.anim 파일 더블 클릭 후 동작 방식 지정 해 주기
-> 동작할 객체를 클릭하고 Animation에서 레코드 (빨간색 동그라미)를 눌러서 셋팅 해준다.
여기서 주의 할 점은 처음 모습 그대로를 표현 해주더라고 아무값이나 한번 값 지정이 필요하다.
만약 캐릭터의 이미지 지정이 필요하면 적당한 시간 간격으로 필요한 이미지를 Drag&Drop 하기만 하면 된다.
Game 종료 시 다른 animation 동작하기 위해서 새로운 anim 파일을 생성한다.
-> 기본 Animation 동작을 만들어 준다
Animator 오픈하여 동작을 원하는 곳에 오른쪽 클릭하여 Make Transition으로 동작 순서 지정한다.
-> 여기서는 아래 동그라미가 다른 객체에 맞아 게임이 끝나면 다른 animation으로 게임이 끝나게 하는 것을 만들어 본다.
상기 이미지와 같이 isDie라는 변수를 만들고 상태값이 변할때(A.anim ->b.anim) Delay가 없도록 설정한다. (Has Exit Time 체크 해제)
-> 애니메이션 전환을 위해 gameManager 설정 필요하다.
float alive = 0f;
public GameObject endPanel;
public Text thisScoreTxt;
public Text maxScoreTxt;
bool isRunning = true;
public Animator anim;
public void gameOver()
{
anim.SetBool("isDie", true);
isRunning = false;
Invoke("timeStop", 0.5f); //timeStop 함수를 0.5초 후에 실행 하라
thisScoreTxt.text = alive.ToString("N2");
endPanel.SetActive(true); //endPanel의 상태를 Active 상태로 변경
// 처음 플레이 할때 최고 점수 갱신
//Unity의 경우 값을 저장할때 Key,Value pair로 값을 저장한다. (PlayerPrefs를 이용)
if (PlayerPrefs.HasKey("bestScore") == false)
{
PlayerPrefs.SetFloat("bestScore", alive);
}
else//최고 점수보다 내 점수가 높을때 점수 갱신
{
if (PlayerPrefs.GetFloat("bestScore") < alive)
{
PlayerPrefs.SetFloat("bestScore", alive);
}
}
float maxScore = PlayerPrefs.GetFloat("bestScore");
maxScoreTxt.text = maxScore.ToString("N2");
}
public void retry()
{
/// MainScene을 Reload한다.
SceneManager.LoadScene("MainScene");
}
/// <summary>
/// 애니메이션간 전환 시간이 없기 때문에 0.5 delay 생성 후 별도의 timeStop 함수 실행
/// </summary>
void timeStop()
{
Time.timeScale = 0.0f;
}
이렇게 하면 Animation clip이나 Controller 설정에 대한 설명은 충분히 하였으리라고 본다.
워낙 직관적인 Tool이라 객체 간의 관계나 상세 detail만 설정 잘 해주면 간단한 게임 구현은 간단한듯 하다..