유니티2D 입문 정리 11 - 애니메이션 컨트롤

woollim·2024년 11월 9일
0

0. 핵심내용

○ Animation & Animator

  • Animation은 더 간단한 애니메이션에 사용되며, Animator는 더 복잡한 애니메이션 시퀀스와 상태 관리에 사용

  • Animation

    • Animation 컴포넌트는 게임 오브젝트에 애니메이션을 추가하는 데 사용됩니다.
    • 이 컴포넌트는 애니메이션 클립을 재생할 수 있습니다.
    • Animation 컴포넌트는 간단한 애니메이션에 적합하며, 스크립트를 통해 직접 제어할 수 있습니다.
    • 애니메이션 클립은 Unity의 Animation window를 통해 생성하거나 편집할 수 있습니다.
    • 예를 들어, 이 컴포넌트를 사용하여 오브젝트의 크기를 변경하거나 색상을 변환하는 등의 간단한 애니메이션을 생성할 수 있습니다.

  • Animator

    • Animator 컴포넌트는 애니메이션의 상태를 제어하고 전환을 관리하는 데 사용됩니다.
    • Animator 컴포넌트는 Animation Controller를 사용하여 애니메이션의 복잡한 상태 기계를 구현할 수 있습니다.
    • Animator 컴포넌트는 여러 애니메이션 클립을 조절하고, 애니메이션 간의 전환을 제어하고, 복잡한 애니메이션 시퀀스를 구현하는 데 적합합니다.
    • 예를 들어, 캐릭터의 걷기, 뛰기, 점프 등의 애니메이션을 관리하는 데 사용될 수 있습니다.
    • Animator 컴포넌트는 Mecanim 애니메이션 시스템의 일부로서, 애니메이션 블렌딩, 트리, 상태 머신 등의 기능을 제공합니다.


1. 애니메이션 컨트롤 하기

○ AnimationController 만들기

using UnityEngine;

public class AnimationController : MonoBehaviour
{
    protected Animator animator;
    protected TopDownController controller;

    protected virtual void Awake()
    {
        animator = GetComponentInChildren<Animator>();
        controller = GetComponent<TopDownController>();
    }
}

○ CharacterAnimationController 만들기

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

public class CharacterAnimationController : AnimationController
{
    // Animator.StringToHash를 통해 Animator 변수 전환에 활용되는 부분에 대한 최적화를 진행할 수 있습니다.
    // StringToHash는 IsWalking이라는 문자열을 일방향 함수인 해쉬함수를 통해 특정한 값으로 변환합니다.
    // 더 궁금하시다면 C# GetHashCode를 검색해보세요!
    private static readonly int IsWalking = Animator.StringToHash("IsWalking");
    private static readonly int IsHit = Animator.StringToHash("IsHit");

    private static readonly int Attack = Animator.StringToHash("Attack");

    private readonly float magnituteThreshold = 0.5f;

    protected override void Awake()
    {
        base.Awake();
    }

    void Start()
    {
        // 공격하거나 움직일 때 애니메이션이 같이 반응하도록 구독
        controller.OnAttackEvent += Attacking;
        controller.OnMoveEvent += Move;
    }

    private void Move(Vector2 obj)
    {
        animator.SetBool(IsWalking, obj.magnitude > magnituteThreshold);
    }

    // OnAttackEvent가 Action<AttackSO>이기 때문에 Attacking이 AttackSO를 사용하지 않아도 매개변수로 가지고 있어야 합니다.
    // 이런 걸 함수(메소드) 시그니처를 맞춘다라고 합니다.
    private void Attacking(AttackSO obj)
    {
        animator.SetTrigger(Attack);
    }

    // 아직 피격부분은 없지만 곧 할 것이기 때문에 일단 둡니다.
    private void Hit()
    {
        animator.SetBool(IsHit, true);
    }

    // 아직 피격부분은 없지만 곧 할 것이기 때문에 일단 둡니다.
    private void InvincibilityEnd()
    {
        animator.SetBool(IsHit, false);
    }
}


2. 애니메이션 세팅하기

○ player_idle - Animation Clip 만들기

  • Character - MainSprite 클릭 (*)
  • Ctrl + 6 또는 Window → Animation → Animation 클릭
  • [프로젝트 뷰] Animation/Player 폴더 생성
  • 그 폴더에서 Create 클릭 → Animator Controller 생성
  • Character에 Animator 컴포넌트 추가하고 Controller에 적용
  • Samples 12 설정
  • 녹화(⏺️)모드 선택
  • MainSprite의 SpriteRenderer에 knight_f_idle_anim_f0 ~ 3 선택 하여 넣기
  • 두 칸씩 띄어 배치
  • MainSprite의 Color를 흰색(rgba : 255,255,255,255)으로 설정
    (이거 안하면 hit 갔다왔을 때 홍익인간 됨, 빨간색 안 돌아온다는 뜻)

○ player_run - Animation Clip 만들기

  • player_run 이름 설정
  • Samples 12 설정
  • 녹화(⏺️)모드 선택
  • MainSprite의 SpriteRenderer에 knight_f_run_anim_f0 ~ 3선택 하여 넣기


○ player_hit - Animation Clip 만들기

  • Create New Clip 클릭
  • player_hit 이름 설정
  • Samples 12 설정
  • 녹화(⏺️)모드 선택
  • knight_f_hut_anim_f0 선택 하여 앞 뒤에 넣음
  • Add Property → Sprite Renderer Color → + 클릭
  • 시작과 끝 프레임을 클릭하여 각각 설정
    (한 프레임 만들고 키프레임을 복사하고 앞뒤로 놓는 방법도 있습니다.)


○ player_attack - Animation Clip 만들기

  • Create New Clip 클릭
  • player_attack 이름 설정
  • Samples 12 설정
  • WeaponSprite의 트랜스폼을 수정
    저는 Scale을 (0.5, 0.7) → (0.8, 0.7) → (0.7, 0.7)로 수정했습니다.
  • 자유롭게 수정해보셔도 괜찮아요! 😇
  • WeaponSprite의 SpriteRenderer의 Order in Layer를 6으로 설정해주세요.


○ player_attack, player_hit 루프 설정하기

  • 애니메이션 클립(player_attack, hit)을 선택하면 인스펙터창이 아래와 같이 나오는데, Loop Time을 체크 해제함


○ Animatior Contoller 수정

  • Window → Animation → Animator 클릭
  • [하이어라키 뷰] Character 선택
  • Attack은 별도의 애니메이션이 들어갈 것이므로 삭제
    (Attack은 활만 띵띵 / idle, run, hit은 캐릭터가 움직였죠?)
  • (idle이 노란색 기본상태로 되어있지 않은 분들만)
    Entry 우클릭 → Set StateMachine Default State → idle 클릭
  • Parameter 클릭 → IsWalking(Bool), Attack(Trigger), IsHit(Bool) 추가
  • idle 우클릭 → Make Transition → run 클릭
  • Transition 설정 변경 → Has Exit Time 체크 해제, Condition 추가
    Transition Duration : 0으로 설정
  • run 우클릭 → Make Transition → idle 클릭
  • Transition 설정 변경 → Has Exit Time 체크 해제, Condition 추가
    Transition Duration : 0으로 설정



○ Layer 추가

활만 띵띵 움직이는 애니메이션을 기존 애니메이션에 추가로 얹고 싶습니다. 독립적인 애니메이션 계층을 만들고 이를 블렌딩하도록 도와주는 기능이 Layer입니다!

  • Animator → Layers → +
  • Attack 이름 변경 → Weight 1 → Blending Additive
  • Empty 노드 추가
  • 다음과 같이 설정 후 Transition 설정 변경
    (transition duration : 0)




○ Character 오브젝트 수정

  • CharacterAnimationController 추가

0개의 댓글