TIL(2024,09,03)캐릭터 애니메이션(Animation)

김보근·2024년 9월 3일

Unity

목록 보기
76/113

TIL : 캐릭터 애니메이션

오늘은 캐릭터 애니메이션 작업을 하면서 알게된부분을 정리해볼것이다.

애니메이션 작업

먼저 캐릭터 에셋을 가져오고 나서 폴더를 열어보면 Idle, Hit, Run 이러한 Sprite들이 있을건데 여기서 이 Sprite들을 모두 드래그 해준후에 Player에 넣어준다.

이러한 형식으로 넣어준다면 이렇게 창이 뜨는데 Idle로 만들어서 저장을 해준다

저장을 해주면 Player와 Idle이 생겨 있을건데 Player을 누르면

이러한 Animator가 나오게 되는데 나머지 Run 부분과 Dead Hit부분은 위와 같이 똑같이 애니메이션을 만들면 되고

이렇게 Idle에 우클릭을 하게되면 Make Transition이 있는데
애니메이션 상황을 어떻게 바꿔주는가 생각을하면된다

예를 들어보자면 지금 Idle이 기본상태인데 여기서 기본상태에서 Run(달리기) 상태로 넘어가야하고 또는 Run(달리기)상태에서도 Idle(기본상태)로 넘어가야하기도 때문에 Make Transition을 두개로 만들어둔 이유이다.

이제 Any State는 어디서든 애니메이션을 바꿔줄수 있는 상태이고 Dead나 Hit 상태는 언제든지 나오는 상황이다. Dead상태는 죽은 상태이기 때문에 그 후 상황은 없어서 돌아오는 Transition은 없고 Hit상태는 아직 죽지않은상태고 맞은상태이기 때문에 Idle 상태와 Run상태로 돌아가는 Transition을 만들어 두었다.

그리고 이제 애니메이터 Parameters부분에 보면 + 부분을 누르게 된다면 이렇게 나오는데 Float를 눌러서 Speed를 할당하고 Trigger을 두개 만들어서 Dead와 Hit 부분을 만들어두었다.

이 Speed 부분은 Float로 0상태일때 Idle상태와 1보다 크다면 Run상태로 하면 바뀌게 될것이다.

Trigger부분은 나중에 맞았을때 상태거나 죽은 상태일때 호출하면 애니메이션이 재생이 될것이다.

이 Transition을 선택하고 선택하게되면 인스펙터 창에 표시가 되는데


Conditions에 Speed를 넣어주고 Greater 0.01을 셋팅해준다.
이 부분은 Speed가 0.01보다 크다면 Run애니메이션으로 넘어가겠다는 뜻이다.

그러면 이 반대편 Transition을 선택한다음


Less로 바꿔서 0.01 보다 작다면 다시 Idle로 넘어간다는 뜻이다.
이렇게 세팅을 해주면 된다.

애니메이션 Override Controller

만약에 이 똑같은 캐릭터의 애니메이션을 만들고 싶다 이러할때
Animator Override Controller 라는것이있다.

이 부분은 Idle Run Dead Hit 똑같이 애니메이션은 위와 같이 만들어 준후에


이 애니메이터 오버라이드 컨트롤러 를 눌러서 생성한후에
이름은 Player2로 만들어 줄것이다.


이렇게 만든후에 컨트롤러에 기존에 만들었던 Player 애니메이터 컨트롤러를 넣어준후에 밑에 Dead Hit Idle Run 이렇게 생성이 되는데 거기에 방금 만들어준 Idle Run Dead Hit 드래그 해서 넣어주면 된다.


이렇게 할당을 해주고 플레이어를 복사해서 객체를 하나를 더만들어준후에
애니메이터에 Player2 컨트롤러를 넣어주게 된다면 Player2 애니메이션이 재생이 될것이다.

스크립트

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

public class Player : MonoBehaviour
{
    // 플레이어의 이동 방향을 저장할 변수 (Vector2는 2D 벡터)
    private Vector2 Playervector;

    // 플레이어의 이동 속도를 조절할 변수 (Inspector에서 조정 가능)
    [SerializeField]
    private float PlayerSpeed;

    // Rigidbody2D 컴포넌트를 참조할 변수 (물리 연산에 사용)
    private Rigidbody2D rb;

    // SpriteRenderer 컴포넌트를 참조할 변수 (스프라이트의 방향을 조정할 때 사용)
    private SpriteRenderer sprite;

    // Animator 컴포넌트를 참조할 변수 (캐릭터 플레이어의 애니메이션 조정할 때 사용)
    private Animator ani;

    // 게임 오브젝트가 생성될 때 초기 설정을 하는 함수 (컴포넌트 참조)
    private void Awake()
    {
        // Rigidbody2D 컴포넌트를 가져와서 rb 변수에 저장
        rb = GetComponent<Rigidbody2D>();

        // SpriteRenderer 컴포넌트를 가져와서 sprite 변수에 저장
        sprite = GetComponent<SpriteRenderer>();

        // Animator 컴포넌트를 가져와서 ani 변수에 저장
        ani = GetComponent<Animator>();
    }

    // 물리 연산이 일정 시간 간격으로 실행되는 함수 (주로 물리 기반 이동 처리)
    private void FixedUpdate()
    {
        // Playervector를 정규화(normalized)하여 방향을 유지하고,
        // 속도와 시간(deltaTime)을 곱해 이동 거리를 계산
        Vector2 vector2 = Playervector.normalized * PlayerSpeed * Time.fixedDeltaTime;

        // Rigidbody2D의 위치를 새로운 위치로 이동시킴
        rb.MovePosition(rb.position + vector2);
    }

    // Input System에서 Move 액션이 발생할 때 호출되는 함수 (InputValue를 통해 입력 값 전달)
    private void OnMove(InputValue value)
    {
        // 입력된 값을 Vector2로 변환하여 Playervector에 저장
        Playervector = value.Get<Vector2>();
    }

    // 모든 업데이트 작업이 완료된 후 실행되는 함수 (주로 그래픽적인 작업 처리)
    private void LateUpdate()
    {

        ani.SetFloat("Speed", Playervector.magnitude);
        // Playervector의 x 값이 0이 아니면 (즉, 왼쪽이나 오른쪽으로 이동 중이면)
        if (Playervector.x != 0)
            // x 값이 음수면 스프라이트를 좌우 반전 (왼쪽을 향하도록)
            sprite.flipX = Playervector.x < 0;
    }
}

여기서 이부분에 ani.SetFloat("Speed" , Playervector.magnitude)가 있는데 앞에는 파라미터 이름값을 넣어주고 이 Vector는 magnitude가 있는데 magnitude는 캐릭터가 정지해 있다면 0 값이 되고 움직이면 0 보다 커질것이다.

적용 영상

profile
게임개발자꿈나무

0개의 댓글