Unity_개발일지_22

홍신영·2024년 11월 9일
0

Unity

목록 보기
23/62

게임에 Sound 넣어보기

먼저 유니티에서 Sound를 조절하기 위해 사용할 컴포넌트를 알아보자.

  1. AudioClip
    오디오 클립은 유니티에서 사운드를 사용할 수 있도록 하는 데이터 타입으로 mp3,wav등의 파일형식을 지원한다.

  2. AudioSource
    위에 있는 오디오파일을 재생 및 볼륨등 조절하는데 사용된다.

  3. AudioListener
    플레이어의 귀의 역할을 하는 컴포넌트로 게임내에 1개만 존재해야한다.

그럼 이제 스크립트를 작성해보자.

먼저 SoundManager이다.

using System;
using UnityEngine;

public class SoundManager : MonoBehaviour
{
    public static SoundManager Instance;

    [SerializeField][Range(0f, 1f)] private float soundEffectVolume; //이펙트 볼륨
    [SerializeField][Range(0f, 1f)] private float soundEffectPitchVariance; //높은음 조절
    [SerializeField][Range(0f, 1f)] private float musicVolume; //브금 볼륨

    private AudioSource musicAudioSource; //브금 볼륨 조절할변수
    public AudioClip musicClip; //브금 파일담을곳

    private void Awake()
    {
        Instance = this;
        musicAudioSource = GetComponent<AudioSource>();
        musicAudioSource.volume = musicVolume; // 볼륨 세팅
        musicAudioSource.loop = true; //루프 돌려주기
    }

    private void Start()
    {
        ChangeBGM(musicClip); //바로 음악 재생
    }

    private void ChangeBGM(AudioClip musicClip)
    {
        Instance.musicAudioSource.Stop(); //멈추고 시작하는게 좋음 꼬이는 경우가 생길수 있다
        Instance.musicAudioSource.clip = musicClip; //뮤직 파일 넣어주고
        Instance.musicAudioSource.Play(); //음악재생
    }

    public static void PlayClip(AudioClip clip)
    {
        GameObject obj = GameManager.Instance.ObjectPool.SpawnFromPool("SoundSource"); //오브젝트로 풀로 5개 오디오파일 생성
        obj.SetActive(true); //켜주고
        SoundSource soundSource = obj.GetComponent<SoundSource>(); //SoundSource클래스 컴포넌트 가져오고
        soundSource.Play(clip, Instance.soundEffectVolume, Instance.soundEffectPitchVariance); //매개변수에 맞게 플레이
    }
}

위 코드처럼 싱글톤을 구현해주고, 이펙트와 BGM 음악에 대한 볼륨 및 루프 세팅을 해준다.
음악 재생시 꼬이는 경우가 있다고 해서 플레이전에 멈추고, 다시 실행하는 방식으로 구현하는 것이 좋다.
오브젝트 풀로 5개정도 미리 만들어놓고, 맞는 소리, 때리는 소리 등이 적절히 들어가 소리를 발생한다.

다음은 SoundSource스크립트다.

using UnityEngine;

public class SoundSource : MonoBehaviour
{
    private AudioSource audioSource;

    public void Play(AudioClip clip, float soundEffectVolume, float soundEffectPitchVariance)
    {
        if (audioSource == null)
            audioSource = GetComponent<AudioSource>();

        CancelInvoke();
        audioSource.clip = clip;
        audioSource.volume = soundEffectVolume;
        audioSource.Play();
        audioSource.pitch = 1f + Random.Range(-soundEffectPitchVariance, soundEffectPitchVariance);

        Invoke("Disable", clip.length + 2);
    }

    public void Disable()
    {
        audioSource.Stop();
        gameObject.SetActive(false);
    }
}

사운드 매니저에서 실행할 Play메소드에 조절할 크립, 이펙트 볼륨과 피치를 매개변수로 가지고, 오디오소드 컴포넌트를 불러오고 매니저와 마찬가지로 CancelInvoke로 끊어주고 넣어주고 플레이하는 방식이다.
피치는 랜덤값을 주어 지루함을 덜 느끼도록 지정해주었다.
그런다음은 다시 꺼주는 작업으로 인포크하여 마무리해주었다.

profile
게임 클라이언트 개발자

0개의 댓글