Coding Feature.

[Unity 2D] Portal 같은 게임 만들기 #8 캐릭터 애니메이션 / 효과음 본문

Toy Project/mini-portal [Unity2D]

[Unity 2D] Portal 같은 게임 만들기 #8 캐릭터 애니메이션 / 효과음

codingfeature 2024. 1. 9. 15:01

캐릭터가 움직일 때 애니메이션을 추가해보겠습니다!

 

플레이어 게임 오브젝트에 

"Player_Idle"

"Player_Run"

"Player_Jump"

애니메이션을 추가해줬습니다.

 

그리고 달릴 때와 점프할 때의 스프라이트들을 각각 추가해줬습니다.

 

그 뒤, Animator의 parameter에 Float형의 "Speed"와 boolean 형의 "IsGrounded"를 추가해줬습니다.

 

그 다음, Animator 내 transition을 다음과 같이 설정했습니다.

 

Idle에서 Run : Speed > 0.1

Run에서 Idle : Speed < 0.1

Any State에서 Jump : IsGrounded == false

Jump에서 Idle : IsGrounded == true

 

조건으로 설정해줬습니다.

 

그리고 Player 오브젝트에 있는 스크립트에 다음 코드를 추가로 작성했습니다.

 

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

public class PlayerMovement : MonoBehaviour
{
    Rigidbody2D m_rb;
..

    public Animator animator;
    
    bool m_isFacingRight;
..

    // Update is called once per frame
    void Update()
    {
        animator.SetFloat("Speed", Mathf.Abs(m_rb.velocity.x));
        animator.SetBool("IsGrounded", m_isGrounded);
        
        if (m_rb.velocity.x < 0 && m_isFacingRight)
        {
            gameObject.GetComponent<SpriteRenderer>().flipX = true;
            m_isFacingRight = false;
        }
        if (m_rb.velocity.x > 0 && !m_isFacingRight)
        {
            gameObject.GetComponent<SpriteRenderer>().flipX = false;
            m_isFacingRight = true;
        }
..

 

Speed 파라미터에는 속도 x좌표값의 절댓값을 주고, IsGrounded는 m_isGrounded를 그대로 제공했습니다.

 

그리고 m_isFacingRight 불리언 형 변수를 추가해서 캐릭터가 어느 방향으로 보고 있는지를 확인하고 그에 맞게 Sprite Renderer의 x좌표를 flip하도록 했습니다.

 

 

 

아래 영상을 참고했습니다!

https://youtu.be/hkaysu1Z-N8?si=W06rNV6a1x9Jq6Sl

 

 

그 다음에는 캐릭터가 달리는 효과음을 추가해보겠습니다!

 

인터넷에서 Running 효과음을 찾고 캐릭터 오브젝트에 추가했습니다.

그리고 PlayerMovement.cs에 다음 코드를 추가했습니다.

 

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

public class PlayerMovement : MonoBehaviour
{
    Rigidbody2D m_rb;
    AudioSource m_audioSource;
..

    // Start is called before the first frame update
    void Start()
    {
..
        m_audioSource = GetComponent<AudioSource>();
..
    }

    // Update is called once per frame
    void Update()
    {
..
        if (m_rb.velocity.x != 0 && m_isGrounded)
        {
            if (!m_audioSource.isPlaying)
                m_audioSource.Play();
        }
        else
        {
            m_audioSource.Stop();
        }
    }
..
}

 

캐릭터의 x좌표 속도가 0이 아니고, 땅에 닿아있는 상태일 경우, m_audioSource.Play() 함수를 통해 오디오를 플레이합니다. 이때 isPlaying를 통해 이미 달리기 효과음이 재생되고 있는 경우 재생을 무시하도록 합니다.

 

 

위와 같은 방법으로 포탈을 통과하는 소리, 전원 버튼을 누르는 소리를 따로 추가해줬습니다.

 

사실을 위처럼 게임 오브젝트에서 효과음을 따로 추가한 뒤에 각 스크립트에서 관리하게 하는 것은 좋은 방법은 아닙니다.

차라리 Audio Controller 같은 스크립트를 따로 만들어서 배경음악과 한꺼번에 관리하도록 하는 것이 큰 프로젝트에 도움이 될 것입니다.

 

현재는 효과음이 얼마 없기 때문에 이렇게 처리했지만 추후에 코드 리팩토링을 하는 과정에서 Audio Manager를 구현해볼 생각입니다!

 

다음에는 게임 시작 화면 및 옵션 화면을 구현해보도록 하겠습니다!