Exemple #1
0
    public override void Init()
    {
        m_audioSource    = this.GetComponent <AudioSource>();
        m_highPassFilter = GetComponent <AudioHighPassFilter>();

        m_childObj = new GameObject[CHILD_COUNT];
        for (int i = 0; i < CHILD_COUNT; i++)
        {
            GameObject empty = new GameObject("EmptyClip");
            empty.AddComponent <AudioSource>();
            empty.transform.parent = transform;
            m_childObj[i]          = empty;
        }
        if (m_AudioClips.Length != 0)
        {
            for (int i = 0; i < m_AudioClips.Length; i++)
            {
                if (m_AudioClips[i] != null)
                {
                    arr_AudioClip.Add(m_AudioClips[i].name, m_AudioClips[i]);
                }
            }
        }
        m_soundPlayData    = new SoundPlayData();
        m_soundPlayDataEft = new SoundPlayData();
    }
Exemple #2
0
 public SoundLoader(SoundPlayData m_PlayData, AsyncOperation request)
 {
     AddPlayData(m_PlayData);
     this.m_Request   = request;
     this.m_StartTime = Time.time;
     m_strName        = m_PlayData.m_strSoundFileName;
 }
Exemple #3
0
 public void Play(SoundPlayData Data)
 {
     if (!m_AudioFilter.CheckFiltering(Data.m_strSoundFileName))
     {
         TryLoad(Data);
     }
 }
Exemple #4
0
    public void ProcessLoad(SoundPlayData Data)
    {
        /// 이미 로드 중인 데이터 클립 제거 추가
        ///
        /// 이미 로드중인 클립이 있는가? => 플레이 리스트에 추가
        ///

        /*
         * for (int i = 0; i < Loaders.size; i++)
         * {
         *  if (Loaders[i].m_strName == Data.m_strSoundFileName)
         *  {
         *     Loaders[i].AddPlayData(Data);
         *      return;
         *  }
         * }
         */
        AudioClip TargetClip = Resources.Load <AudioClip>(string.Concat(m_strLocalLoad, Data.m_strSoundFileName));

        if (TargetClip == null)
        {
            Debugs.LogError("[사운드로드] ProcessLoad 실패! 대상 클립(", Data.m_strSoundFileName, ")을 찾을 수 없습니다!");
        }
        else
        {
            m_Storage.AddAudioClip(TargetClip);
            Data.m_AudioClipGroup.PushAudioClip(TargetClip);
            Data.LoadComplete(TargetClip, 0.0f);
            Debugs.Log(string.Concat("[사운드로드] 완료! ", Data.m_LoadedAudioClip.name, " 소요 시간 [", 0.0f, "]"));
            Data.TryPlay();
        }
        return;
    }
Exemple #5
0
    public virtual bool CanPlay(SoundPlayData Data)
    {
        if (Data.m_LoadedAudioClip == null)
        {
            Debugs.LogError("[사운드-재생] 클립이 null입니다!");
            return(false);
        }

        if (Data.m_trPlace == null)
        {
            Debugs.LogError("[사운드-재생] 재생할 장소가 null입니다!");
            return(false);
        }
        return(true);
    }
Exemple #6
0
    /// <summary>
    /// 오디오 오브젝트를 생성한다.
    /// </summary>
    /// <param name="groupType"></param>
    /// <param name="optionType"></param>
    /// <returns></returns>
    //public static AudioObject CreateAudioObject(eAudioOptionType optionType = eAudioOptionType.SE, eAudioGroupType groupType = eAudioGroupType.UI)
    //{
    //    return CreateAudioObject(Instance.gameObject.transform, optionType, groupType);
    //}

    //public static AudioObject CreateAudioObject(Transform parent, eAudioOptionType optionType = eAudioOptionType.SE, eAudioGroupType groupType = eAudioGroupType.UI)
    //{
    //    AudioObject NewAudioObject = Instantiate(Instance.AudioObjectPrefab);
    //    NewAudioObject.SetParent(parent);
    //    NewAudioObject.transform.localPosition = Vector3.zero;
    //    NewAudioObject.SetAudioChannel(optionType);
    //    NewAudioObject.SetAudioGroup(groupType);
    //    return NewAudioObject;
    //}


    #region Play (SoundPlayData모델)

    /// <summary>
    /// 최종 사운드 재생
    /// </summary>
    /// <param name="Data"></param>
    public void Play(SoundPlayData Data)
    {
        if (Data == null)
        {
            Debugs.LogError("[사운드-재생] 이 사운드 재생 데이터는 NULL입니다!");
            return;
        }

        if (!AvaliableAudioChannel(Data.m_eAudioChannel))
        {
            Debugs.LogError("[사운드-재생] 재생할 채널이 없거나 비활성화 중입니다!");
            return;
        }

        m_AudioChannelList[Data.m_eAudioChannel].Play(Data);
    }
Exemple #7
0
    public override void TryPlay(SoundPlayData Data)
    {
        if (!CanPlay(Data))
        {
            return;
        }

        if (m_Channel.m_AudioObjectList.ContainsKey(Data.m_strFinalKey))
        {
            m_Channel.Stop(m_Channel.m_AudioObjectList[Data.m_strFinalKey]);
        }

        ///이미 플레이중인 같은 클립의 오디오가 있다면 새로운 오디오는 그 오디오를 가져오고 아니라면 풀에서 꺼내옵니다.
        AudioObject NewAudioObject = m_Channel.GetAudioObject();


        #region Exception
        ExceptionProcess(NewAudioObject);
        #endregion

        ///오디오 정보를 세팅합니다.
        NewAudioObject.SetAudioChannel(m_Channel);
        NewAudioObject.SetAudioGroup(NewAudioObject.m_Data.m_eAudioGroup);
        NewAudioObject.SetPlayData(Data);
        NewAudioObject.SetParent(NewAudioObject.m_Data.m_trPlace);
        NewAudioObject.SetPriority(m_Channel.m_nPriority);
        NewAudioObject.transform.localPosition = Vector3.zero;
        NewAudioObject.OnStop = null;

        m_Channel.AddAudioObject(NewAudioObject);

        //AudioObject TargetObject = m_Channel.m_AudioActiveObjectList.Count > 0 ? m_Channel.m_AudioActiveObjectList[m_Channel.m_AudioActiveObjectList.Count - 1] : null;

        NewAudioObject.Play(Data.m_LoadedAudioClip, NewAudioObject.m_Data.m_fDelay, 1, NewAudioObject.m_Data.m_bLoop, NewAudioObject.m_Data.m_fTime);

        NewAudioObject.OnStop = () =>
        {
            m_Channel.DeactiveList_Enqueue(NewAudioObject);
            m_Channel.RemoveAudioObject(NewAudioObject);
        };

        m_Channel.m_AudioActiveObjectList.Add(NewAudioObject);

        m_Channel.m_AudioFilter.RecordFilterInfo(new AudioFilterInfo(Data.m_strSoundFileName));

        AudioClipGroup.RecordPlayingClip(Data.m_LoadedAudioClip);
    }
Exemple #8
0
    public void LoadAsyncAudioClip(SoundPlayData Data, AudioPlayType PlayType)
    {
        ///해당 그룹에 클립이 있는가? => 해당 그룹에서 클립을 꺼내옴
        ///클립이 없는가? => 저장소에 클립이 있는가? (2)로 없는가? (1)로
        ///(1)로드후 저장소에 추가 => (2)저장소에서 해당 그룹에 클립을 할당
        ///
        ///위의 로직이 완료되면 Play 시작
        ///

        Data.m_PlayType = PlayType;

        AudioClip TargetClip = null;

        if (Data.m_AudioClipGroup.HasAudioClip(Data.m_strSoundFileName, out TargetClip))
        {
            Data.LoadComplete(TargetClip, 0.0f);
            Data.TryPlay();
        }
        else
        {
            ProcessLoad(Data);
        }
    }
Exemple #9
0
 public void AddPlayData(SoundPlayData m_PlayData)
 {
     m_PlayDataList.Add(m_PlayData);
 }
Exemple #10
0
    public override void TryPlay(SoundPlayData Data)
    {
        if (!CanPlay(Data))
        {
            return;
        }

        ///이미 플레이중인 같은 클립이 있는지 검사합니다.
        AudioObject AlreadyPlayingAudio = m_Channel.m_AudioActiveObjectList.Find(x => x.m_Data.m_strSoundFileName == Data.m_strSoundFileName);
        bool        bAlreadyPlaying     = AlreadyPlayingAudio != null;
        ///이미 플레이중인 같은 클립의 오디오가 있다면 새로운 오디오는 그 오디오를 가져오고 아니라면 풀에서 꺼내옵니다.
        AudioObject NewAudioObject = bAlreadyPlaying ? AlreadyPlayingAudio : m_Channel.GetAudioObject();

        #region Exception
        ///버그에 대한 예외처리 및 디버그 코드 작성
        ExceptionProcess(NewAudioObject);
        #endregion

        ///오디오 정보를 세팅합니다.
        NewAudioObject.SetAudioChannel(m_Channel);
        NewAudioObject.SetAudioGroup(NewAudioObject.m_Data.m_eAudioGroup);
        NewAudioObject.SetPlayData(Data);
        NewAudioObject.SetParent(NewAudioObject.m_Data.m_trPlace);
        NewAudioObject.SetPriority(m_Channel.m_nPriority);
        NewAudioObject.transform.localPosition = Vector3.zero;
        NewAudioObject.OnStop = null;

        m_Channel.AddAudioObject(NewAudioObject);

        NewAudioObject.OnStop = () =>
        {
            m_Channel.DeactiveList_Enqueue(NewAudioObject);
            m_Channel.RemoveAudioObject(NewAudioObject);
        };

        ///같은 BGM을 플레이하는경우
        if (bAlreadyPlaying && NewAudioObject.m_bFadingOut)
        {
            ///가장 최근에 플레이한 BGM으로 교체하기위해 앞에서 빼고 뒤에 넣어줌
            m_Channel.m_AudioActiveObjectList.Remove(NewAudioObject);
            m_Channel.m_AudioActiveObjectList.Add(NewAudioObject);
        }
        else if (!bAlreadyPlaying)
        {
            NewAudioObject.FadeVolume = 0;
        }

        AudioObject TargetObject = m_Channel.m_AudioActiveObjectList.Count > 0 ? m_Channel.m_AudioActiveObjectList[m_Channel.m_AudioActiveObjectList.Count - 1] : null;
        if ((bAlreadyPlaying && NewAudioObject.m_bFadingOut) || !bAlreadyPlaying)
        {
            ///가장 최근에 플레이한 오브젝트가 일시정지하려는 중이 아니면 중지시킵니다.
            if (TargetObject != null)
            {
                if (!TargetObject.IsPause)
                {
                    if (!TargetObject.m_bFadingOut)
                    {
                        TargetObject.FadeOutAndPause();
                    }
                }
            }

            ///대상 BGM을 루프로 재생합니다.
            if (!bAlreadyPlaying)
            {
                NewAudioObject.Play(Data.m_LoadedAudioClip, NewAudioObject.m_Data.m_fDelay, 1, true, NewAudioObject.m_Data.m_fTime);
            }
            if (NewAudioObject.m_Data.m_bUseFadeIn)
            {
                NewAudioObject.FadeIn();
            }
        }


        ///이미 플레이 중이지 않았다면 활성화된 리스트에 추가합니다.
        if (!bAlreadyPlaying)
        {
            m_Channel.m_AudioActiveObjectList.Add(NewAudioObject);
        }

        m_Channel.m_AudioFilter.RecordFilterInfo(new AudioFilterInfo(Data.m_strSoundFileName));
        m_Channel.PauseBGM();

        AudioClipGroup.RecordPlayingClip(Data.m_LoadedAudioClip);
    }
Exemple #11
0
 /// <summary>
 /// 플레이를 시도합니다.
 /// </summary>
 /// <param name="Data"></param>
 /// <param name="Clip"></param>
 /// <param name="fDelayTime">로드까지 걸린시간 그 사운드의 지연시간에 빼줘야함</param>
 public abstract void TryPlay(SoundPlayData Data);
Exemple #12
0
 public override void TryLoad(SoundPlayData Data)
 {
     SoundManager.Instance.m_Loader.LoadAsyncAudioClip(Data, m_PlayType);
 }
Exemple #13
0
 /// <summary>
 /// 먼저 오디오 클립 로드를 시도합니다. 성공하면 TryPlay로 이어지고 플레이를 시도합니다.
 /// </summary>
 /// <param name="Data"></param>
 /// <param name="eCachDestroy"></param>
 public abstract void TryLoad(SoundPlayData Data);
Exemple #14
0
 /// <summary>
 /// 먼저 로드를 시도합니다. 성공하면 TryPlay로 이어지고 플레이 됩니다.
 /// </summary>
 /// <param name="Data"></param>
 public void TryLoad(SoundPlayData Data)
 {
     m_LoadType.TryLoad(Data);
 }
Exemple #15
0
 public SoundPlayData(SoundPlayData Data)
 {
     Init(Data.m_strSoundFileName, Data.m_eAudioGroup, Data.m_eAudioChannel, Data.m_eAudioClipGroup, Data.m_trPlace, Data.m_bLocalLoad, Data.m_eLoopType, Data.m_strKey, Data.m_fFadeInTime, Data.m_fFadeOutTime, Data.m_fDelay, Data.m_fVolume);
 }
Exemple #16
0
 public void SetPlayData(SoundPlayData Data)
 {
     m_Data      = Data;
     this.Volume = Data.m_fVolume;
 }