하참이의 아이디어노트

Unity 강의 5일차 (3) - 캐릭터 애니메이션 본문

Unity/Unity 기초

Unity 강의 5일차 (3) - 캐릭터 애니메이션

하참이 2025. 1. 20. 14:28

본 강의는 다음 문서를 참고하여 제작하였습니다. 자세한 내용은 하단 링크를 참조하시거나 댓글로 질문 남겨주시면 성심성의껏 답변 드리겠습니다.

 

https://learn.unity.com/tutorial/3-3gang-saengdonggam-issneun-kaerigteo-mandeulgi?uv=2021.3&pathwayId=63ca4663edbc2a7be103183f&missionId=63c7676bedbc2a66daff99b1&projectId=63ca1d01edbc2a5f4807369e#

 

3.3강 - 생동감 있는 캐릭터 만들기 - Unity Learn

개요: 이제 게임은 그럴싸하게 만들어졌는데, 플레이어 캐릭터의 생동감이 부족하네요. 캐릭터가 지면을 미끄러지듯 이동하는 것이 아니라, 달리고, 점프하고, 사망하는 등의 애니메이션을 만

learn.unity.com

 


 

이제 게임으로 보일만한 요소는 얼추 가춰졌습니다 (아직 만족 못하시는 분들도 계실 것 입니다. 이해합니다.)

 

게임이 움직이기는 하지만 뭐 사운드도 없고, 캐릭터는 그냥 공중을 날듯이 해괴한 모습으로 점프하고있고... 고쳐야할점이 산더미네요.

 

그렇게 생각하시면 오히려 좋습니다! 더 다양한 기능을 배우고 싶다는 뜻 이니까요.

 

 

이번시간에는 캐릭터에게 애니메이션을 추가하는 방법을 배워봅시다.

 

 

Player에게 적용되어있는 Animator 컴포넌트에 Controller를 더블클릭하여 '애니메이션 컨트롤러'에 접근합니다.

 

 

 

 

 

 

해당 애니메이션 창은 Window - Animation - Animator로도 접근할 수 있습니다.

 

흠... 무언가들이 엄청 연결되어있네요. Walk를 더블클릭해봅시다.

 

 

헉! 영문모를 폴더로 온것같아요!

 

바로 Animator에서 강조하는 Animation이 들어있는 Assets 폴더입니다. Clips에는 여러가지 Animation이 들어있는 것을 확인 할 수 있죠.

 

최하단의 Idle을 클릭하면 다음과 같이 애니메이션을 볼 수 있고, Clips에서 고른 다양한 애니메이션을 미리 볼 수 있습니다.

 

 

 

 

Walk를 한 번만 클릭하여 Walk 애니메이션에 대한 정보를 Inspector 창에 띄워봅시다.

 

 

 

최하단에 Transactions가 존재하는 것을 볼 수 있습니다.

 

애니메이션은 자연스러움이 중요합니다. 그리고 어느 상태에서 어느 상태로 이동하느냐가 자연스러움을 만드는데에 큰 역할을 합니다. Transactions는 해당 애니메이션에서 어떤 애니메이션으로 이동할 수 있는지 경로를 나타냅니다. Animator창에서도 Walk는 Idle과 Run이 연결되어있는 것을 볼 수 있습니다.

 

Idle을 누르고 Transactions에서 Idle -> Walk를 클릭해봅시다.

 

 

맨 하단에서 애니메이션이 할당 된 게임 오브젝트가 전환되는 애니메이션을 수행하는 것을 볼 수 있습니다.

 

그리고 프로그래스바 사이에는 Condition이라는 것이 존재합니다.

 

애니메이션이 전환되기 위한 조건값들을 의미합니다.

 

 

 

Static_b가 false이고 Speed_f가 0.25 이상이어야 한다고 하네요. (Greater) 

 

한 번 조정을 해 보겠습니다.

 

Animator 창 에서 Parameter값들을 봅시다.

 

 

 

 

이 Parameters는 애니메이션들을 전환하기 위한 condition에 사용 되는 변수들입니다.

 

맨 위에 Speed_f가 보이는 것을 확인할 수 있습니다. 값을 0.3으로 변경해봅시다.

 

 

 

게임을 실행해보면 walk_static이 적용되며 캐릭터가 움직이는 것을 확인할 수 있습니다.

 

 

 

하지만 걷는것은 배경의 속도에 비해 캐릭터가 너무 여유로워보입니다.

 

달리기 위한 속도를 체크해봅시다.

 

 

 

0.5로 설정되어있네요. 넉넉하게 Speed_f를 1로 수정해봅시다.

 

 

 

 

사진으로만 봤는데도 캐릭터가 매우 역동적으로 움직이는 것을 확인할 수 있습니다.

 

하지만 점프를 하는 것 역시 애니메이션이 자연스럽지 않네요. 점프 애니메이션은 없을까요?

 

Animator 창의 좌측에 Jumping탭이 있는것을 보아 점프 애니메이션도 준비되어있는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

이번에는 스크립트를 이용하여 애니메이션을 전환해보겠습니다.

 

PlayerController를 다음과 같이 수정합니다.

 

 

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

public class PlayerController : MonoBehaviour
{
    private Rigidbody playerRb;
    public float jumpForce = 10;
    public float gravityModifier = 1;
    public bool isOnGround = true;
    public bool gameOver = false;
    private Animator playerAnim;

    // Start is called before the first frame update
    void Start()
    {
        playerRb = GetComponent<Rigidbody>();
        playerAnim = GetComponent<Animator>();
        Physics.gravity *= gravityModifier;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isOnGround)
        {
            playerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            isOnGround = false;
            playerAnim.SetTrigger("Jump_trig");
        }        
    }
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isOnGround = true;
        }
        if (collision.gameObject.CompareTag("Obstacle"))
        {
            gameOver = true;
            Debug.Log("Game Over");
        }
    }
}

 

 

 

캐릭터가 굉장히 역동적으로 점프하는 것을 볼 수 있습니다.

 

 

 

 

그런데 점프 애니메이션이 너무 빨리 끝납니다. 땅에 닿기도 전에 달리기 애니메이션이 나오네요.

 

이럴 경우엔 애니메이션의 재생 속도를 줄여 애니메이션의 길이를 늘리는 방법이 있습니다.

 

Running_Jump의 Speed를 0.7정도로 수정해봅시다.

 

 

 

이것 외에도 점프를 자연스럽게 바꾸는 법은 Player 오브젝트의 Rigidbody.Mass를 변경하거나 PlayerController에서 부여했던 JumpForce, GravityModifier를 수정할 수 있습니다.

 

 

성인 남성의 몸무게는 약 70정도 합니다. Mass를 70으로 변경하여봅시다. 또한 중력 가속도는 1.9이므로 Gravity Modifier를 1.9로 설정해보죠. 이렇게 현실과 비슷한 단위를 사용하여 디테일하게 조절할 수 있습니다. 단, 이러면 점프가 너무 무거워지겠네요. JumpForce를 강하게 하여 점프력을 키워봅시다. JumpForce는 800으로 해보겠습니다. 

 

마지막으로 사망 처리 애니메이션을 설정해보겠습니다.

 

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

public class PlayerController : MonoBehaviour
{
    private Rigidbody playerRb;
    public float jumpForce = 10;
    public float gravityModifier = 1;
    public bool isOnGround = true;
    public bool gameOver = false;
    private Animator playerAnim;

    // Start is called before the first frame update
    void Start()
    {
        playerRb = GetComponent<Rigidbody>();
        playerAnim = GetComponent<Animator>();
        Physics.gravity *= gravityModifier;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isOnGround && !gameOver)
        {
            playerRb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            isOnGround = false;
            playerAnim.SetTrigger("Jump_trig");
        }        
    }
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isOnGround = true;
        }
        if (collision.gameObject.CompareTag("Obstacle"))
        {
            gameOver = true;
            Debug.Log("Game Over");
            playerAnim.SetBool("Death_b", true);
            playerAnim.SetInteger("DeathType_int", 1);
        }
    }
}

 

 

게임이 오버되었을 경우 점프를 막고, 게임 사망 처리를 하였습니다.

 

이제는 진짜 미니게임이라고 불러도 훌륭하겠네요!

 

다음시간에는 효과음과 이펙트에 대해 다뤄보도록 하겠습니다.

 

감사합니다!