스파르타 게임개발종합반(Unity)/사전캠프 공부 기록

[Unity] 소리 & 배경음악 넣기 - AudioSource, AudioClip, PlayOneShot, Play, AudioManager, 배경음악, 효과음, DontDestroyOnLoad, 싱글톤

테크러너 2024. 4. 9.

사운드 구상하기

1. 배경음악 : 게임이 시작하면 배경음악이 나오기

2. 뒤집을 때 : 카드 뒤집을 때 뒤집는 소리 나오기

3. 맞췄을 때 : 카드 두 장이 같을 때 소리 나오기

 

 

카드 뒤집을 때 소리 나오기

Card 프리팹으로 들어가서 Audio Source 컴포넌트를 추가해주었습니다.

해당 컴포넌트를 Card.cs 에서 컨트롤해줄 것입니다.

 

 

Card.cs

    AudioSource audioSource;
    public AudioClip clip;
    
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }
    
    // 카드가 오픈됐을 때
    public void OpenCard()
    {
        if (GameManager.Instance.secondCard != null) return;

        audioSource.PlayOneShot(clip); // Play()와 차이점 : 다른 음악끼리 겹치지 않음, 딱 한 번만 실행됨
        // 이후 생략
    }

카드가 뒤집어졌을 때 소리를 clip에 담아서 실행시켜주는 코드입니다.

 

Clip에는 'flip' 음악을 넣어주었습니다.

 

 

 

같은 그림 카드 맞췄을 때 소리 나오기

GameManager.cs

    AudioSource audioSource;
    public AudioClip clip;
    
    void Start()
    {
    	// 코드 생략
        audioSource = GetComponent<AudioSource>();
    }
    
    // 카드 매치 기능
    public void Matched()
    {
        // 같은 그림
        if(firstCard.idx == secondCard.idx)
        {
            // 파괴해라.
            audioSource.PlayOneShot(clip);
            // 코드 생략
        }
    }

 

마찬가지로 clip에 'match' 음악을 넣어주었습니다.

 

 

 

배경음악 나오기

빈 오브젝트로 AudioManager를 생성해주고, AudioManager.cs도 생성했습니다.

 

public class AudioManager : MonoBehaviour
{
    AudioSource audioSource;
    public AudioClip clip;

    void Start()
    {
        audioSource = GetComponent<AudioSource>();

        audioSource.clip = this.clip;
        audioSource.Play(); // 반복 재생, 지속적으로 재생
    }
}

일반적으로 배경음악Play를 사용하여 지속적으로 재생되도록 설정하고, 효과음PlayOneShot을 사용하여 각각의 효과음을 재생합니다.

 

AudioManager 오브젝트에 AudioSource 컴포넌트와 AudioManager.cs를 추가해주었습니다.

아까와는 다르게 AudioManager.cs의 Clip에 배경음악을 넣어주었습니다.

그리고 AudioSource 컴포넌트에 'Play On Awake'는 꺼두었습니다.

 

 

StartScene에서도 배경음악 소리 나오기

StartScene에서도 배경음악이 재생되도록 설정합니다.

 

StartScene에서 MainScene으로 넘어가서도 배경음악이 끊기지 않고 이어지려면 AudioManager.cs를 수정해야 합니다.

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance;
    AudioSource audioSource;
    public AudioClip clip;

    private void Awake()
    {
        if(instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // 씬을 이동해도 AudioManager 오브젝트가 파괴되지 않음
        }
        else // 이미 존재할 때
        {
            Destroy(gameObject); // 새로 생성되는 MainScene의 AudioManager를 파괴해서 AudioManager는 하나만 남게됨
        }
    }
    // Start() 생략
}

AudioManager싱글톤으로 변경했습니다.

그런데 문제는 StartScene에도, MainScene에도 AudioManager가 있어서 배경음악이 2번이나 실행됩니다.

그래서 이미 AudioManager 존재할 때 새로 생성되는 MainScene AudioManager 파괴해서 AudioManager 하나만 남기게 했습니다.

 

 

 

결과

 

반응형

댓글