유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

씬 상에 Cube를 하나 생성해 주고 큐브가 클릭된 상태에서 Window - Animation - Animation을 생성해준 후 Create를 해준다. animation을 생성해주면 기본적으로 animation과 animation controller가 생성된다.

 

처음에는 기본 단위로 1초가 세팅된다. 마우스 휠을 끌어 원하는 분량만큼 애니메이션 런타임을 조정할 수 있겠다.

큐브의 포지션값이 이동하는 애니메이션을 만드려면 Add Property 후 Transform의 position 값을 가져오면 된다. 마찬가지로 회전은 rotation, 크기는 scale을 가져오면 되겠다. 애니메이션을 입히고 싶은 시간을 타임라인에 위치시켜주고(흰색 세로 bar) 좌측 상단에 Add Keyframe을 클릭해주면 지점이 설정된다. 그리고 그 위치에서 포지션, 로테이션, 스케일값을 원하는대로 조정해 주면 애니메이션이 작동한다.

 

만약 특정 지점에서 애니메이션을 수정 또는 추가하고자 하면 좌측 상단의 빨간색 버튼을 클릭 후 수정해주면 저장된다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon
유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon
유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

좌측 하단 Curves를 선택하면 다음과 같은 그래프 창이 나타난다. 일반적으로는 정규분포의 형태로 양쪽 끝부분이 둥글게 그래프가 만들어진다. 하지만 등속도로 애니메이션이 적용되기 위해서는 양 끝에 있는 점을 클릭하고 그 옆에 생성된 작은 점을 이동시켜 일 자 모양으로 맞춰주면 된다. 또는 양쪽 말단 점에서 우클릭 후 Auto로 설정해주면 직선의 형태로 그래프가 변경된다. 추가적으로 그래프 크기를 줄이고 싶으면 Shift + 휠을 사용해주면 된다.

 

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon
유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

지금까지 배운 애니메이션을 약간 응용해서 시계 애니메이션을 만들었다. 시침과 분침 각각에 Z축을 움직이는 애니메이션을 적용하면 시침/분침의 오브젝트가 그 상태에서 360도로 회전하게 된다. 하지만 시계는 가운데를 중심으로 시침/분침이 360도로 회전해야 한다. 

 

따라서 시계의 중앙부분에 Create Emty를 생성하고 각각의 빈 오브젝트에 시침/분침 오브젝트를 자식화해주면 된다. 그리고 각 빈 오브젝트에 z값을 360도로 회전시키는 애니메이션을 적용시켜주면 가운데를 중심으로 시침/분침이 이동하게 된다. 해당 스킬을 적용하면 태양계의 자전과 공전에도 응용할 수 있겠다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

 

시계 애니메이션에 이어서 몇가지 애니메이터 설정을 추가해주었다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon
유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

시계방향으로 움직이는 반시계 방향으로 움직이도록 바꾸는 애니메이션을 추가적으로 적용해보았다. 똑같이 bun2 애니메이션을 생성해주었고 이번에는 Animator에서 설정을 바꾸어주었다. default로 플레이 시작 시 bunrot 애니메이션(시계방향)이 적용되지만 bunrot과 bun2 애니메이션을 make transition(마우스 우클릭 후 설정) 해주면 중간에 애니메이션 전환이 발생한다. Transition Duration값은 애니메이션이 전환되는 지점에서의 딜레이라고 보면 된다. 0일 경우 칼 같이 바뀌고, 시간차가 있는 경우 잠깐 멈췄다가 천천히 바뀌는 모습을 볼 수 있다. 추가적으로 has exit time을 체크 해제해준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChgAni : MonoBehaviour
{
    Animator anim;
    bool tmpFlg;
    void Start()
    {
        anim = GetComponent<Animator>();
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            tmpFlg = anim.GetBool("chgAniFlg");
            if (tmpFlg)
            {
                anim.SetBool("chgAniFlg", false);
            }
            else
            {
                anim.SetBool("chgAniFlg", true);
            }
        }
    }
}

스페이스 바를 누르면 애니메이션이 전환되는 코드를 작성했다. 그 전에 애니메이터 컨트롤러에서 ChgAniFlg라는 파라미터를 만들고 bool 타입으로 설정했으며 conditions에 해당 파라미터를 추가해주었다. 여기서 bun -> bun2 트랜지션 파라미터의 컨디션의 true / bun2 -> bun 트랜지션 파라미터의 컨디션은 false로 설정해준다.

위의 코드를 애니메이션이 적용된 오브젝트에 함께 넣어주고 실행하면 스페이스 키를 눌렀을 때 bunrot에서 bun2 애니메이션으로 전환되고 한번 더 누르면 다시 반대로 동작되는 것을 확인할 수 있다.

 

+애니메이션을 3개 만들어 놓고 키보드 1번/2번을 눌렀을 때 애니메이션이 1 -> 2 / 2 ->3 으로 이동하게 만드는 코드는 다음과 같다. check1과 check2 파라미터는 bool타입으로 설정해주었다.

유니티로 졸업프로젝트를 진행하면서 특정 조건에 따라 애니메이션을 바꿔줘야했는데 애니메이션을 바꾼 방법에 대해서 적어보려고 한다. 우선 애니메이션을 변경하기 위해 당연히 애니메이터가 필요하다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

Asset에서 마우스 우클릭으로 애니메이터 컨트롤러를 만들 수 있다. 프로젝트를 할 때 우리는 기존에 존재하는 에셋을 샀기 때문에 필요한 애니메이션만 골라서 컨트롤러에 넣어주었다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

이때 Entry가 처음 시작이고 각 화살표 방향으로 애니메이션이 바뀌게 된다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

저 화살표를 Transition이라고 한다. Transition은 바꾸기 원하는 애니메이션(A)에서 우클릭을 누르고 Make Transition 선택 후 다음 애니메이션(B)을 클릭하면 해당 애니메이션으로의 transition(A->B)이 생긴다.

근데 이때 Transition만 만들게 되면 해당 애니메이션이 한 번만 플레이되고 바로 다음 애니메이션으로 넘어간다. 특정 상황에서만 애니메이션이 바뀌는 것을 원했기 때문에 각 transition에 조건을 추가해주었다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

여기 이 애니메이터 창에서 왼쪽 위 Parameters 창을 눌러준다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

그럼 이런 창이 뜨는데 아무것도 추가해주지 않았다면 목록이 비어있을 것이다. 여기에 원하는 방식의 조건을 추가해줄 수 있다. 오른쪽의 +버튼을 누르면 Float, Int, Bool, Trigger 이렇게 네 가지 항목이 존재한다. 이 넷 중에 조건으로 원하는 것을 선택해주면 되는데 예를 들어, 나는 ButtonPush라는 이름의 Bool parameter를 만들었다. 그리고 이 ButtonPush가 참일 때만 CorgiWalk에서 CorgiEat으로 애니메이션이 바뀌게 설정했다. 이를 확인하기 위해 CorgiWalk에서 CorgiEat으로 가는 transition을 눌러보면 이런 인스펙터 창이 뜬다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon
CorgiWalk에서 CorgiEat으로 가는 transition의 인스펙터

오른쪽에 Conditions 부분에 ButtonPush가 true로 설정된 것을 알 수 있다. 이것은 애니메이터의 ButtonPush라는 parameter가 참일 때만 애니메이션이 바뀐다는 것을 의미한다. 동시에 여러가지 조건을 주고 싶다면 아래에 +버튼을 눌러서 조건을 더 추가해줄 수 있다. 만약 parameter를 float으로 설정한다면 속도가 얼마 이상일 때 애니메이션을 바꾸게하는 등의 설정도 가능하다. 이런 식으로 애니메이터를 세팅해놓으면 실제 코드에서 parameter를 변경해줄 수 있다.

간단한 예시를 위해 코드를 하나 작성했다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

Animator를 코드에 추가해주고 처음 부분에 SetBool 함수를 통해 ButtonPush parameter는 false 상태로 시작할 수 있게 했다. 애니메이터의 다른 파라미터도 마찬가지로 바꿀 수 있다. SetInt, SetFloat 명령어와 parameter명, 값을 넣어주면 해당 parameter가 세팅된다.

이 코드 상에서는 버튼을 누르면 ButtonPush가 true가 되도록 설정했다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

Hierarchy 창에 GameObject를 하나 추가하고 여기에 작성한 코드를 넣어주었다. Corgi와 Button도 넣고 Corgi에는 아까 만들어두었던 Animator를 넣어준다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

버튼의 On Click으로 buttonPush 함수를 넣어줬다.

유니티 다른 오브젝트 애니메이션 - yuniti daleun obeujegteu aenimeisyeon

처음에는 걷고 있던 강아지가 버튼을 누르면 먹는 모션을 취한다. 이 방식을 사용하여 프로젝트에서는 애니메이션을 컨트롤했다. 그래도 초반 코드가 너무 비효율적인 부분이 있어서 고치고 싶긴 하다... 이 방법만 사용한다고 애니메이션을 원하는 대로 설정할 순 없었어서 조건 설정을 잘해주는게 중요하고 또 애초에 애니메이터를 만들 때부터 효율적으로 만들 수 있는 방법을 생각하고 시뮬레이션을 해본다음에 만들면 더 좋을 것 같다.