Unity-미니 프로젝트#4

이준호·2023년 11월 5일
0

미니 프로젝트 4일차


오늘은 사운드를 구현하였다.

SoundManager.sc를 만들어서 한 스크립트에서 사운드를 관리하고 싱글톤을 상속받게 하여서
다른 곳곳에서 효과음이 필요할 때 쉽게 가져와 쓸 수 있도록 하였다.


먼저 Resources폴더 안에 Sounds폴더를 만들어 필요함 배경음악과 효과음들을 넣어주고
AudioSource와 AudioClip변수들을 각각 필요한 부분에 이름에 맞춰 선언해주었다.

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

public class SoundManager : SingletonMonoBase<SoundManager>
{

private AudioSource BGM;
private AudioSource audioSource;

public AudioClip openCard;
public AudioClip matchSuccess;
public AudioClip buttonClick;
public AudioClip gameWin;
public AudioClip gameLose;
public AudioClip titleMusic;
public AudioClip mainMusic;

SoundManager에서 Initialize함수를 만들어서 필요한 사운드들을 Resources.Load 해주어서 인스펙터 창에서 직접 드래그&드롭 하지 않고 가져오도록 하였다.

public void Initalize()
{
	openCard = Resources.Load<AudioClip>("Sounds/OpenCard");
    matchSuccess = Resources.Load<AudioClip>("Sounds/MatchSuccess");
    buttonClick = Resources.Load<AudioClip>("Sounds/ButtonClick");
    gameWin = Resources.Load<AudioClip>("Sounds/GameWin");
    gameLose = Resources.Load<AudioClip>("Sounds/GameLose");
    titleMusic = Resources.Load<AudioClip>("Sounds/TitleMusic");
    mainMusic = Resources.Load<AudioClip>("Sounds/MainMusic");
    
    // Scene을 이동 했을 때, AudioSource Component가 또 추가되는 것을 막기위한 처리.
    if (audioSource == null && BGM == null)
    {
    	audioSource = gameObject.AddComponent<AudioSource>();
        BGM = gameObject.AddComponent<AudioSource>();
    }
    BGM.loop = true;	// 배경음악은 계속 나와야 하기에 loop를 켜준다.
    BGM.volume = 0.2f;		// 소리자체가 커서 조절
    audioSource.volume = 0.3f;	// 모바일 이기에 폰 볼륨으로 조절 가능하여 자체에서 작게 설정
    audioSource.playOnAwake = false;
}

그리고 각각 상황에 맞는 효과음을 주기 위해서 상황별로 함수를 만들어서 편하게 호출하여 소리를 가져올 수 있도록 만들고 중간중간 배경음악이 멈춰야하는 상황이나 멈춘 음악이 다시 나와야할 때 를 위해서 AudioSource를 멈추거나 실행시키는 처리를 넣어둬 상황과 어울리게 하였다.

public void OpenCard()
{
	audioSource.PlayOneShot(openCard);
}
public void MatchSuccess()
{
	audioSource.PlayOneShot(matchSuccess);
}
public void ButtonClick()
{
	audioSource.PlayOneShot(buttonClick);
}
public void GameWin()
{
	BGM.Stop();
    audioSource.PlayOneShot(gameWin);
}
public void GameLode()
{
	BGM.Stop();
    audioSource.PlayOneShot(gameLose);
}
public void GoMain()
{
	BGM.clip = mainMusic;
    BGM.Play();
}
public void GoTitle()
{
	BGM.clip = titleMusic;
    BGM.Play();
}

이렇게 만든 함수들을 다른 효과음이 필요한 스크립트들에 가서 SoundManager.Instance.필요한 함수명 을 작성하여 사용하기 편하게 하였다.

SoundManager.sc도 GameManager.sc처럼 싱글톤 스크립트를 상속했기에 Title Scene에서 빈 게임오브젝트에 TitleScene.sc를 만들어 Awake()에서 Initialize함수를 호출해서 GameManager처럼 파괴되지 않고 다른 씬을 넘어다니며 정보를 가지고 이동하게 할 것이다.

public class TitleScene : MonoBehaviour
{
	private void Awake()
    {
    	SoundManager.Instance.Initialize();
    }
}

이런식으로 하면 일일히 inspector창에 AudioClip들을 드래그&드롭 해주지 않아도 처음 시작할 때 Load되어 한번에 넣어진다.

빈 게임오브젝트는 그저 정보를 불러오는 용으로 사용한다.


실제 다른 스크립트에 효과음을 넣어보며 계속 실행과 멈춤을 반복하며 다른 팀원들이 작성한 스크립트들을 분석할 필요가 있었다. 예를들어 카드가 매칭이 됐을시에 "띠링"하는 효과음을 넣을라면 그 카드가 매칭되는 순간의 스크립트와 코드를 찾아가서 써줘야했기에 나도 다른 팀원들의 코드들을 한번 더 살펴보며 좋은 공부의 기회가 됐다.

타이틀씬과 메인씬을 갈 때는 문제가 없지만 메인씬에서 타이틀씬으로 올 때에 오디오소스들을 또 불러와서 2개가 4개가 되고 계속 늘어가는 오류를 겪어서

        if ( audioSource == null && BGM == null)

        {

            audioSource = gameObject.AddComponent<AudioSource>();

            BGM = gameObject.AddComponent<AudioSource>();

        }

같은 코드를 사용해 맨 처음만 넣어 그 다음부턴 들어가지 않게 하여 소스의 중복을 막을 수 있었다.

그 이외에도 효과음 재생을 넣어줄 함수가 또 다른 효과음을 넣어주는 함수와 같이 사용되고 있어서 효과음이 두번 재생되는 경우가 있었는데 그 때에는

isSoundCheck라는 bool값 변수를 만들고 if문을 통해서 함수가 실행되기 전에는 true상태고 중복되는 함수가 실행되기 전에는 false로 만들어 중복 실행이 되지 않도록 하였다.

후에 마지막에 가장 머리아팠던 오류는 게임오버시에 나오는 효과음이 계속 안들리는 것 이었다. 다른건 다 되는데 그 부분에서 가장 머리가 아팠는데 계속 코드와 스크립트들을 돌아다니고 게임을 시작하고 멈추고 하며 찾다 결국 탁 느낌이 오면서 찾았는데 처음에 Audio Clip파일들을 Resource파일에 넣어주고 이름을 바꿀 때에

배경음악의 이름을 잘못 설정하여 게임오버 이름으로 지어버려 게임이 오버가 되어도 계속해서 배경음악이 재생되는것으로 착각하였던 것이다. 바로 이름을 바꾸고 다시 설정하여 정상적으로 작동이 될 수 있었다.

이번 작업에서도 팀원들과 서로 소통하고 모르는 부분에대해 자세히 알려주는 팀원들 덕분에 더 성장할 수 있었고 많이 배우는 기회가 되었다. 팀원들에게 너무 감사하다고 전하고싶다.


Audio기능 상기시키기

public class AudioTest : MonoBehaviour

{

    public AudioSource audioSource;public AudioClip audioClip;private void Start()

    {

        audioSource.Play(); //재생

​

        audioSource.Stop(); //정지

​

        audioSource.Pause(); //일시정지

​

        audioSource.UnPause(); //일시정지 해제

​

        audioSource.playOnAwake = true; //씬 시작시 바로 재생

​

        audioSource.loop = true; //반복 재생

​

        audioSource.mute = true; //음소거

​

        audioSource.volume = 1.0f; //볼륨 (0.0 ~ 1.0f)

​

        audioSource.PlayOneShot(audioClip, 1.0f); //특정 클립 한번 만 재생

​

        audioSource.clip = audioClip; //오디오 클립 교체if (audioSource.isPlaying) Debug.Log("오디오 재생중입니다."); //오디오 재생 여부 확인

    }

}
profile
No Easy Day

0개의 댓글