Unity / 개인 프로젝트 / 플랫폼 게임 / 배경음악 / 배경음악 재생 조건 변경

2023. 10. 11. 22:12카테고리 없음

배경음악을 추가했다.

 

1. 씬에 오디오소스 바로 넣는 방법

- 오디오 소스 (mp3 파일) 를 씬에 바로 드래그드랍하면 AudioSource 컴포넌트로 생성되어, 볼륨 등을 설정할 수 있다.

이 방식은 씬이 시작되면 해당 오디오가 바로 재생된다.

 

 

2. 씬 진행 시 오디오 소스 변경하기

배경음악 하나가 아니라 조건에 따라 배경음악 A, B가 재생되도록 설정하고 싶었다.

A가 기본적으로 재생되고, 플레이어가 추락하면 B 재생음악이 재생되도록 설정하고자 한다.

 

1) 먼저 배경음악 A,B를 씬에 넣고 Play On Awake를 체크 해제한다.

Play On Awake를 해제 안하면 씬을 플레이하자마자 A,B 둘다 재생되어버리니까,

일단 기본적으로는 체크를 해제해두고 밑에 나올 스크립트를 통해 PlayOnAwake를 관리한다.

오디오소스를 씬에 넣고, 프리팹화했다. (다른 씬에도 적용하기 위함)

 

2) BGM Manager 스크립트 생성 후 플레이어에 적용

- 해당 구현은 플레이어의 위치값을 전달받아야 해서 플레이어에 해당 스크립트를 적용했는데,

스크립트는 SoundManager를 만들어 넣어두거나 기타 빈 오브젝트에 넣어도 무방할 듯 하다.

코드는 아래와 같다.

using UnityEngine;

public class BGMController : MonoBehaviour
{
    public AudioSource musicSourceA; // 배경음악 A를 위한 AudioSource
    public AudioSource musicSourceB; // 배경음악 B를 위한 AudioSource

    private bool isPlayingMusicB = false; // B 배경음악을 재생 중인지 여부
    private Vector3 lastPlayerPosition; // 이전 플레이어 위치
    private float fallDuration = 0f; // 플레이어가 떨어지고 있는 시간

    private void Start()
    {
        musicSourceA.enabled = true;
        musicSourceB.enabled = true;

        musicSourceA.Play(); // 게임 시작 시 배경음악 A를 재생
        lastPlayerPosition = transform.position; // 초기 플레이어 위치
    }

    private void Update()
    {
        Vector3 currentPlayerPosition = transform.position; // 현재 플레이어 위치
        float yPositionDifference = lastPlayerPosition.y - currentPlayerPosition.y;

        if (yPositionDifference > 0)
        {
            // 플레이어가 떨어지고 있는 상태인 경우
            fallDuration += Time.deltaTime; // 시간 측정

            if (fallDuration >= 1.5f && !isPlayingMusicB)
            {
                // 플레이어가 5초 이상 떨어지고 BGM이 재생 중이 아닌 경우
                isPlayingMusicB = true;
                musicSourceA.Stop();
                musicSourceB.Play();
            }
        }
        else
        {
            // 플레이어가 떨어지고 있지 않은 상태
            fallDuration = 0f; // 떨어지는 시간 초기화
        }

        // 플레이어 위치 업데이트
        lastPlayerPosition = currentPlayerPosition;

        // B음악이 종료된 경우 A음악으로 전환
        if (!musicSourceB.isPlaying && isPlayingMusicB)
        {
            isPlayingMusicB = false;
            musicSourceB.Stop();
            musicSourceA.Play();
        }
    }
}

 

3) 플레이어에 스크립트 적용

플레이어에 스크립트를 적용하고, A / B 음악소스 프리팹을 넣어준다.

 

플레이어가 1.5초 이상 추락할 시 B 음악이 재생된다.

 

 

그러나 이렇게 배경음악을 적용하면 씬이 바뀔때마다 배경음악이 끊긴다.

씬 마다 이어지도록 하려면 AudioManager를 만들고, DontDestroyOnLoad를 적용하라고 하는데 이해가 안되어 구현에 실패했다.