본문 바로가기

[unity] 모듈 제작 : 사운드 플레이어 만들기(2)

앤디가이 2022. 5. 16.

사운드 플레이어 모듈의 핵심 스크립트인 SoundObject 클래스를 구현해보고, 적용 방법에 대해 알아보자.

 

1. 사운드 오브젝트 클래스 정의

 - 해당 스크립트가 적용되는 GameObject는 AudioSource 컴포넌트를 필요로 한다.

 - 사운드가 재생되는 오브젝트에는 SoundObject 컴포넌트가 붙어야 한다.

 - 사운드 재생 기능을 구현한다.

 - 사운드의 일시정지/해제 기능을 구현한다.

 - 코루틴을 사용하여 일정 시간 Delay 후 재생 가능하도록 구현한다.

 - 재생이 완료 된 사운드 오브젝트를 Destroy 한다.

 

2. 사운드 오브젝트 클래스 구현

 - Scripts 폴더에 SoundObject.cs 클래스를 생성한다.

 - SoundObject.cs 의 코드를 아래와 같이 작성해 보자.

using System;
using System.Collections;
using UnityEngine;

namespace Container.Sound
{
    [RequireComponent(typeof(AudioSource))]
    public class SoundObject : MonoBehaviour
    {
        [SerializeField]
        private AudioSource audio_Source = null;
        
        private AudioClip audio_Clip = null;

        private IEnumerator obj_CurrentRotine = null;

        private System.Action action_FinishListener = null;

        private bool isStopEnable = true;

		private bool isPlaying = false;

		[SerializeField]
        private bool isDestroyWhenPlayEnd = true;

        public AudioSource Audio{
            get { return audio_Source; }
            set { audio_Source = value; }
        }

        public AudioClip Clip
        {
            get { return audio_Clip; }
            set { audio_Clip = value; }
        }

        public bool IsPlaying
		{
			get { return isPlaying; }
		}
        private void Awake()
        {
            if(GetComponent<AudioSource>())
                audio_Source = GetComponent<AudioSource>();
        }
              
        public void Play(float _volume, float _delaySeconds, bool _isLoop, bool _isStopEnable, System.Action finishLisener = null)
        {
            if(audio_Source == null)
            {
                Debug.Log("Audio Source is Null");
                return;
            }
            isStopEnable = _isStopEnable;

            audio_Source.clip = Clip;
            audio_Source.volume = _volume;
            audio_Source.loop = _isLoop;
            action_FinishListener = finishLisener;
			obj_CurrentRotine = CoPlaySound(_delaySeconds);
			StartCoroutine(obj_CurrentRotine);
        }

        public void Pause()
        {

            audio_Source.Pause();
        }

        public void unPause()
        {
            audio_Source.UnPause();
        }

        public void Stop()
        {
            if (isStopEnable)
            {
                audio_Source.Stop();
				if(obj_CurrentRotine !=null)
                    StopCoroutine(obj_CurrentRotine);
                isPlaying = false;
                DestroySound();
            }
        }

		IEnumerator CoPlaySound(float delayTime)
		{
			isPlaying = true;
			yield return new WaitForSeconds(delayTime);
			audio_Source.Play();
            yield return new WaitForSeconds(Clip.length);
			isPlaying = false;
            if (action_FinishListener != null)
                action_FinishListener();

            if(!audio_Source.loop)
                DestroySound();
		}

        private void DestroySound()
        {
            try
            {
				if(isDestroyWhenPlayEnd)
                    Destroy(gameObject);
            }
            catch(Exception e)
            {
                Debug.Log(e.ToString());
            }
        }
    }
}

 - SoundPlayer클래스로 부터 SoundObject 클래스의 Play()함수가 호출된다.

 - isStopEnable 멤버 변수를 가지고 있으며, 사운드 재생 중간에 Stop(삭제) 여부를 설정한다.

(UI에서 버튼을 눌러서 생기는 버튼 이펙트 음 같은 경우는 중간에 Stop이 되면 짤리는 것처럼 재생되므로 이런 경우 해당 옵션을 true 로 설정하는게 좋다)

 

댓글