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(); }
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; }
public void Play(SoundPlayData Data) { if (!m_AudioFilter.CheckFiltering(Data.m_strSoundFileName)) { TryLoad(Data); } }
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; }
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); }
/// <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); }
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); }
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); } }
public void AddPlayData(SoundPlayData m_PlayData) { m_PlayDataList.Add(m_PlayData); }
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); }
/// <summary> /// 플레이를 시도합니다. /// </summary> /// <param name="Data"></param> /// <param name="Clip"></param> /// <param name="fDelayTime">로드까지 걸린시간 그 사운드의 지연시간에 빼줘야함</param> public abstract void TryPlay(SoundPlayData Data);
public override void TryLoad(SoundPlayData Data) { SoundManager.Instance.m_Loader.LoadAsyncAudioClip(Data, m_PlayType); }
/// <summary> /// 먼저 오디오 클립 로드를 시도합니다. 성공하면 TryPlay로 이어지고 플레이를 시도합니다. /// </summary> /// <param name="Data"></param> /// <param name="eCachDestroy"></param> public abstract void TryLoad(SoundPlayData Data);
/// <summary> /// 먼저 로드를 시도합니다. 성공하면 TryPlay로 이어지고 플레이 됩니다. /// </summary> /// <param name="Data"></param> public void TryLoad(SoundPlayData Data) { m_LoadType.TryLoad(Data); }
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); }
public void SetPlayData(SoundPlayData Data) { m_Data = Data; this.Volume = Data.m_fVolume; }