Unity Animation

2024. 4. 18. 21:10Unity/Unity 학습정리

 게임을 하다보면 물론 게임성도 중요하지만, 비주얼도 매우 중요하다. 플레이어가 적을 죽일때 플레이어의 모션과 적의 맞을때의 모션과 죽을때의 모션 그리고 사운드 까지 적절하게 조합이된다면 게임이 매우 재밌어 질 것이다. 개인적으로 하고있는 프로젝트에서 플레이어의 움직임을 애니메이터를 이용해 관리하고 실제로 적용시키기위해 조금 공부를 해보았다.

 

목차

    1.  Animation 생성
    2.  Animation Controller
    3.  Animation Script
    4.  마무리

     


    Animation

    이번 포스팅에서는 플레이어의 움직임 애니메이션을 위해 했던 과정들을 담을 예정이다. 기본적으로 Unity Animation은 Anim 파일로 Animation Controller을 통해 제어하고 동작한다.

     


    Animation 생성

     Unity의 예전 버전에서는 Animation을 사용했었지만 최근 버전에서는 Animator 컴포넌트를 오브젝트에 붙혀 해당 오브젝트의 애니메이션을 관리하고 제어한다. Anim파일 생성하는건 다양한 방법이있다. Sprite를 쓰거나 RigidBody를 쓰거나 두 개 다 같이 사용해서 만들수도있다. 하지만 이번 포스팅에서는 움직임 애니메이션만 구현할 것 이기 때문에 sprite만 이용해 Animation을 생성 할 것 이다.

     보통 스프라이트 에셋을 다운받아오면 이미지파일 안에 다양한 Sprite가 존재한다. 해당 Image파일을 Sprite Editor로 Multie Sprite를 만들어(보통 다 만들어져있다) 여러개의 Sprite로 쪼갤 수 있다.

    그럼 쪼개진 스프라이트중 여러가지를 Hierarchy 창에 올리게 된다면 해당 Sprite들로 구성된 Anim파일이 만들어진다.

    Anim파일을 에디터에서 연모습

    Anim 파일을 Unity Editor에서 열게되면 해당 모습이 나오게 되고 내가 넣었던 Sprite들이 들어가있다. 해당 Sprite들을 프레임 별로 나눠서 동작시킬수가 있고, 느리게 동작시키고 싶으면 프레임간의 간격을 넓히면되고 아니면 좁혀서 사용하면 된다. 해당 내용은 개인 프로젝트의 성향이나 작동방식에 따라 달라지게 될것이다. 물론 걷는것은 반복적으로 실행해야하기 때문에 Loop Time에 체크를 해준다.

    Loop Time 체크

    이런방식으로 애니메이션을 만들고 저장해주면 이제 애니메이션 컨트롤러에서 제어할 수 있게된다.


     

    Animation Controller

    이렇게 생긴것이 애니메이션 컨트롤러인데 해당 파일을 열면 아래의 화면이 나온다.

    지금은 구현해놓은 상태지만 회색 Bar들과 주황색 Bar 빼고 왼쪽에 Parameters도 빼고 나타난다

    기본적으로 Entry는 실행하면 Player_Idle을 실행하게 해놨다. 해당 애니메이션은 플레이어가 가많이 있을때 동작하는 애니메이션으로 동적인 느낌을 준다. 이제 내가 만든 애니메이션들을 모두 Animator창에 삽입해주고 화살표(Transition)을 이어서 어떨때 애니메이션을 바꿔서 옮길지 조건도 정한다.

    Transition을 열면 player_Idle->Player_Walk_Up 이다. 그러니깐 가많이 있는 상태에서 위로 가는 애니메이션으로 동작시켜라 라는 것이다. 그럼 위를 갈때를 알려줘야하는데 밑에 Conditions를 보면 MoveY라는 변수가 들어가있다. 해당 변수를 아까 봤던 Animator Controller에서 추가를하면 스크립트에서 MoveY변수에 접근을 할 수있는데 해당 변수에 접근을해 값을 지정해줄 수 있다. (스크립트에서 위로갈때 MoveY변수를 1로 만들어주는 것)  그렇게 한다면 MoveY가 0보다 커지면 해당 Player_Walk_Up 애니메이션이 동작하게 되는것이다. 

     반대 Transition도 마찬가지이다. 입력이 들어오지 않는다면 MoveY가 점점 작아져 0까지 도달할테니 어떠한 구간에서 처리를 하면 다시 반대로 애니메이션을 돌릴 수 도 있는 것이다.

    • Fixed Duration : 두 개의 애니메이션 상태 사이의 전환에 걸리는 시간을 나타낸다.
    • Transition Duratior : 현재 상태의 지속 시간을 기준으로 한 상대적인 전환 지속 시간이다.
    • Transition Offset : 전환될 도착 상태에서의 플레이를 시작할 시간의 오프셋입니다. 예를 들어 값이 0.5일 경우, 목표 상태가 타임라인의 50% 지점에서 플레이를 시작한다.
    • Interruption Source : 전환이 중단될 수 있는 상황을 제어하는 데 사용한다.

    이제 애니메이션 컨트롤러까지 세팅이 끝났다. 마지막으로 스크립트에서 조건변수들에 접근해 내가 원하는 방식으로 애니메이션이 작동시킬수 있다.


     

    Animation Script

     Player 프리팹에 Animator 컴포넌트가 들어가있고 Player_Controller가 들어가있다. 그러면 이제 Player.cs에서 해당 컴포넌트에 접근할 수 있다.

     

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Player : MonoBehaviour
    {
        static public Player instance;
    
        public Animator anim;
        
    
    
        void Start()
        {
            anim = GetComponent<Animator>(); 
        }

     

    불필요한 부분은 날리고 Animator 컴포넌트를 선언하고 해당 컴포넌트를 GetComponent해온다.

    우리는 MoveX, MoveY 조건변수가 있었다. 좌우로 움직일땐 MoveX에 접근 위아래로 움직일때 MoveY에 접근하면된다. 여기서 유저 Input에 따라서 방향이 달라진다. 유니티에서는 유저인풋에따른 방향을 제공하는 강력한 함수가 있다.

    Input.GetAxis("Horizontal"))
    Input.GetAxis("Vertical")

    해당 값들 모두 -1<= x <=1을 왔다갔다한다. Vertical 방향은 위로갈때 1이고 아래로 갈때 -1, Horizontal은 오른쪽이 1 왼쪽이 -1이다. 그리고 anim컴포넌트에는 변수에 접근하고 값을 지정해줄수있는 함수를 제공한다.

    anim.SetFloat("MoveX", Input.GetAxis("Horizontal"));
    anim.SetFloat("MoveY", Input.GetAxis("Vertical"));

    anim.SetFloat(string,float); 인데 string과 일치하는 변수에다가 float값을 세팅해준다는 뜻이다.

    이렇게 세팅을하게되면 transition에 넣어놨던 conditions변수들이 의도하던데로 작동하고 애니메이션이 움직이게 된다.


     

    마무리

    애니메이터를 다루면서 처음에는 어려웠다. 사실 스크립트의 작성양은 많지 않지만 transition의 설계와 캐릭터 움직임과 애니메이션 프레임간을 조절하는것이 핵심인거같다. 그래도 애니메이션을 넣고나니 확실히 비주얼적으로 게임이 개선되었고 플레이를한다는 느낌이 난다.

     

     

    'Unity > Unity 학습정리' 카테고리의 다른 글

    Unity - 각도 구하기  (0) 2024.05.16
    Unity - LayerMask  (0) 2024.05.09
    Unity - Coroutine2  (0) 2024.04.22
    Unity - Coroutine  (1) 2024.04.19
    #1 중복 없이 숫자를 뽑아 배열에 저장  (0) 2024.04.15