Unity_본캠프

[내일배움캠프 4일차] 브금을 깔자

티백고래 2025. 4. 10. 22:24

1. 오늘의 할 일

브금을 깔 겁니다

그런데 이제 카운트다운이 10초 남으면 알람소리가 나야하는 것.

 

2. 어디부터 건드려야 하지?

1. 씬을 구비한다.

 

뭐가 많죠?
팀플용이라 그렇습니다.

이미 오디오 매니저를 만든 것도 확인할 수 있습니다.

 

그렇게 작성하는 지금 오디오 매니저에 들어있는 코드

 

코드1

더보기

public class AudioManager : MonoBehaviour
{
    public static AudioManager instance; //싱글톤

    public AudioSource bgmSource; //bgmSource라는 이름으로 밑에 있는 BGM오브젝트의 오디오소스를 들고올 것
    public AudioSource alertSource; //alertSource라는 이름으로 밑에 있는 Alert 오브젝트의 오디오소스를 들고올 것

    private void Awake()
    {
        if (instance == null)
        {
            instance = this; //싱글톤
            DontDestroyOnLoad(gameObject); //씬을 넘어가서도 부서지지 않게(BGM)
        }
        else
        {
            Destroy(gameObject);
        }
    }
    void Start()
    {

        //각 소스에서 오디오소스 컴포넌트를 들고온다.
        bgmSource = GetComponent<AudioSource>();
        alertSource = GetComponent<AudioSource>();

        PlayBGM();
    }

    public void PlayBGM()
    {

        //BGM이 안틀어져있으면, 실행한다.
        if (!bgmSource.isPlaying)
        {
            bgmSource.Play();
        }
    }

    public void PlayAlert()
    {

        //알람음이 안켜져있으면, 실행한다. (이건 게임매니저에서 부른다)
        if (!alertSource.isPlaying)
        {
            alertSource.Play();
            Debug.Log("알람on!");
        }
    }

    public void StopAlert()
    {

        //알람음이 켜져있으면, 끈다. (게임매니저에서 중지한다)
        if (alertSource.isPlaying)
        {
            alertSource.Stop();
            Debug.Log("알람off!");
        }
    }
}

 

그리고 결과값.

좌측 하단에 보면 알람on! 이 뜨는 것을 보니, PlayAlert()는 확실히 불러졌다.

그러나, alertSource의 음악이 Play 되지 않으니, 카운트다운이 끝나고 불러져야할 StopAlert();는 불러지지 않은 모습이다.

그런데 bgm은 잘 됐단말이지….

그런데? BGM도 Awake를 끄니까 작동이 안됐습니다.

그럼 즉, AudioManager 라고 쓰고 전혀 작동하지 않았다는 뜻인데 무엇이 문제인가 했더니

 

>Clip에 음악이 들어가야하는데 Clip에 안들어갔다!!!!

입니다.

 

2. 다 울었으면, 그럼 이제 오류를 고치자.

 

기왕 이렇게 된거, 어차피 BGM은 Loop에 Awake를 켜두니 알아서 잘 돌아갔겠다, AudioManager에 Alert만 할당하면 될 것 같다.

더보기

public class AudioManager : MonoBehaviour
{   //중복코드 제외함
    AudioSource alertSource;
    public AudioClip Alert; //Alert라는 이름으로 AudioClip을 부름

    //싱글톤 있음
    void Start()
    {

        //오디오소스의 컴포넌트를 들고옴. alertSource의 Clip을 Alert로 지정.
        alertSource = GetComponent<AudioSource>();
        alertSource.clip = Alert;
    }

    public void PlayAlert() //GameManager에서 사용됨
    {

        // alertSource가 재생되지 않고있던 상태라면, 실행함.
        if (!alertSource.isPlaying)
        {
            alertSource.Play();
        }
    }

    public void StopAlert() //GameManager에서 사용됨
    {
        if (alertSource.isPlaying)
        {
            alertSource.Stop();
        }
    }
}

 

결과.

해냈다!!!! 정상적으로 10초가 되자 알람음이 울리고, 알람이 꺼지기도 한다.

여담으로, 파괴금지 처리를 해놓았기 때문에 저 상태로 스테이지 이동>다른 스테이지로 이동해도 정상적으로 BGM이 나오고, 10초 남았을 때는 알람음도 울린다. 

 

3. 요약

1. AudioSource에 브금이 없던 상태에서, 브금을 넣어주고 싶다면 Clip을 쓰는 게 좋다.

(그래야 Play() 든 PlayOneShot()이든 먹힌다.)

2. 상황에 맞춰 잠깐씩 한 번만 나타나는 짧은 효과음 같은 것은 GameManager처럼 같은 곳에 넣어두고 작동 시켜도 정상적으로 작동한다.

3. 단일 브금이라면 여기처럼 그냥 오브젝트에 BGM을 넣고 반복해서 돌려도 된다. 하지만 씬이 바뀌었을 때 BGM이 바뀔 경우, BGM을 교체할 스크립트를 따로 짜야한다.