[Unity] 스크립트로 애니매이션 커스터마이즈하기

부제: Customize Animation using Script

애니매이션을 스크립트로 커스터마이즈(이하 변경)하기 위해서는 스크립트의 Execution Order(이하 실행 순서)에 대한 이해가 필요하다.  스크립트의 실행 순서란 무엇을 말하는가.  Unity 메뉴얼에 도식화가 잘 되어 있는데, 약간 복잡해 보이지만 위에서 아래로 순서대로 정렬되어 있기 때문에 보기는 어렵지 않다.

Script Execution Order (Unity 메뉴얼)

Update와 LateUpdate 부분 발췌

실행 순서에 대해 자세한 설명은 차후에 하기로 하고, 그림에 표시된 박스 위주로 설명 해보겠다. 스크립트의 실행 순서는 크게는 Awake -> Start -> Update 순서로 진행된다.  Update와 LateUpdate의 차이는 위의 그림에서도 알 수 있듯이, internal animation update (애니매이션 관련 update)가 이루어지기 전과 후라고 보면 된다.  즉, internal animation update가 이루어지면 애니매이션에서 콘트롤하고 있는 변수(position, rotation, scale 등등)가 Update까지 진행되었던 모든 변경사항(만약 변경했다면)들을 오버라이드하여 animation이 만들어진대로 플레이가 된다.  그러나 LateUpdate에서는 Update와는 달리, 애니매이션이 콘트롤하는 변수가 어떤 것이든 간에 이미 animation update가 이루어진 후이고, ‘Scene Rendering’이전이기 때문에 어떤 것이든 변경이 가능하고 그 변경한데로 렌더링이 가능하다.  

간단히 테스트 프로그램을 만들어 보자.

Cube를 하나 만들고, Animation 컴포넌트를 attach한 후에, 애니매니션을 생성하고, 이름을 myAnim이라고 하자.

Inspector: Cube

myAnim의 애니매이션은 Cube의 position을 x 방향으로 10만큼 이동했다가 돌아오는 것으로 제작되었다.

Animation Window

플레이 해보면 아래와 같이 애니매이션 된다.

커스터마이즈 전 애니매이션

이제 스크립트를 작성하여, LateUpdate에서  transform 변경을 시도해보자.  CustomAnim.cs를 만들어서 Cube 게임오브젝트에 attach시키고, 포지션을 현재위치보다 y축으로 +4되도록 하였다. 코드는 아래와 같다.

public class CustomAnim : MonoBehaviour {
    private void LateUpdate()
    {
        transform.position += new Vector3(0, 4, 0);
    }
}

다시 플레이해보면 아래와 같이 포지션이 변경되어 렌더링되는 것을 볼 수 있다.

물론, 애니매이션을 변경하려면, 애니매이션 원본 리소스 파일을 변경하는 것이 당연하다.  애니매이션을 스크립트로 변경하는 경우는 게임 런타임 중에 어떤 효과를 주고 싶을 때 사용할 수 있을 것 같다.  캐릭터 애니매이션의 경우에도 사용할 수 있지만 찢어지거나 늘어나 보일 수가 있기 때문에 잘 조절해서 사용할 필요가 있다. 끝.   


Leave a Reply

Your email address will not be published. Required fields are marked *