/// <summary> /// 下载单词发音【主要用于在创建地图时进行发音缓存】 /// </summary> /// <param name="word">Word.</param> public void DownloadPronounceCache(HLHWord word) { wordToPronounce = word; // 从发音缓存查询是否有该单词的缓存 Pronunciation pro = GetPronunciationFromCache(word); // 如果没有,则重新下载 if (pro == null) { string pronounceUrl = string.Empty; // 检查该单词是否有过下载错误 PronounceErrorRecord errorRecord = CheckPronounceErrorExist(word); // 如果没有错误,使用默认下载链接 if (errorRecord.wordId == -1) { pronounceUrl = word.pronounciationURL; } // 如果出现过错误 else if (errorRecord.wordId >= 0) { switch (errorRecord.errorCode) { // 如果默认发音地址出现过错误,则使用备用发音地址 case PronounceErrorCode.ErrorWithURL_1: pronounceUrl = word.backupProuounciationURL; break; // 如果备用发音地址出现过错误,则使用默认发音地址 case PronounceErrorCode.ErrorWithURL_2: pronounceUrl = word.pronounciationURL; break; case PronounceErrorCode.Unknown: break; } } // 有可用发音链接 if (pronounceUrl != string.Empty) { try { if (string.Equals(pronounceUrl, currentConnectingUrl)) { return; } // 开启新的下载协程 IEnumerator downloadCoroutine = CachePronouciationFinishDownloading(pronounceUrl, word); StartCoroutine(downloadCoroutine); } catch (System.Exception e) { Debug.Log(e); } } } }
/// <summary> /// 检查请求单词之前的网络下载是否出现过错误 /// </summary> /// <returns>The pronounce error exist.</returns> /// <param name="word">Word.</param> private PronounceErrorRecord CheckPronounceErrorExist(HLHWord word) { PronounceErrorRecord errorRecord = new PronounceErrorRecord(-1, PronounceErrorCode.Unknown); for (int i = 0; i < errorRecords.Count; i++) { PronounceErrorRecord tempRecord = errorRecords[i]; if (word.wordId == errorRecord.wordId) { errorRecord = tempRecord; break; } } return(errorRecord); }
/// <summary> /// 下载读音文件并在下载完成后播放单词读音的协程 /// </summary> /// <returns>The pronunciation when finish downloading.</returns> /// <param name="www">Www.</param> private IEnumerator CachePronouciationFinishDownloading(string url, HLHWord word) { float timer = 0; using (WWW downloadWww = new WWW(url)) { timer += Time.deltaTime; // 下载超时退出下载 if (timer >= wwwTimeOutInterval) { downloadWww.Dispose(); yield break; } yield return(downloadWww); // 出现异常退出下载 if (!string.IsNullOrEmpty(downloadWww.error)) { Debug.Log(downloadWww.error); downloadWww.Dispose(); yield break; } if (downloadWww != null && downloadWww.isDone) { try { // 从下载数据中获取发音clip AudioClip pronunciationClip = downloadWww.GetAudioClip(false, false, AudioType.MPEG); //Debug.LogFormat("缓存完成:{0}", url); if (pronunciationClip == null) { downloadWww.Dispose(); } else { // 创建新的发音缓存 Pronunciation pro = new Pronunciation(word, pronunciationClip); // 添加缓存 AddPronounceCache(pro); downloadWww.Dispose(); } } catch (System.Exception e) { Debug.Log(e); if (downloadWww.url.Equals(wordToPronounce.pronounciationURL)) { PronounceErrorRecord wdErr = new PronounceErrorRecord(wordToPronounce.wordId, PronounceErrorCode.ErrorWithURL_1); errorRecords.Add(wdErr); } else if (downloadWww.url.Equals(wordToPronounce.backupProuounciationURL)) { PronounceErrorRecord wdErr = new PronounceErrorRecord(wordToPronounce.wordId, PronounceErrorCode.ErrorWithURL_2); errorRecords.Add(wdErr); } downloadWww.Dispose(); } } } }
/// <summary> /// 下载读音文件并在下载完成后播放单词读音的协程 /// </summary> /// <returns>The pronunciation when finish downloading.</returns> /// <param name="www">Www.</param> private IEnumerator PlayPronunciationWhenFinishDownloading(string url) { float timer = 0; using (pronunciationWWW = new WWW(url)) { currentConnectingUrl = url; timer += Time.deltaTime; // 下载超时退出下载 if (timer >= wwwTimeOutInterval) { pronunciationWWW.Dispose(); yield break; } yield return(pronunciationWWW); // 出现异常退出下载 if (!string.IsNullOrEmpty(pronunciationWWW.error)) { Debug.Log(pronunciationWWW.error); pronunciationWWW.Dispose(); yield break; } if (pronunciationWWW != null && pronunciationWWW.isDone) { try { AudioClip pronunciationClip = pronunciationWWW.GetAudioClip(false, false, AudioType.MPEG); if (pronunciationClip == null) { pronunciationWWW.Dispose(); } else { Pronunciation pro = new Pronunciation(wordToPronounce, pronunciationClip); AddPronounceCache(pro); GameManager.Instance.soundManager.PlayPronuncitaion(pronunciationClip, false); pronunciationWWW.Dispose(); } } catch (System.Exception e) { Debug.Log(e); if (pronunciationWWW.url.Equals(wordToPronounce.pronounciationURL)) { PronounceErrorRecord wdErr = new PronounceErrorRecord(wordToPronounce.wordId, PronounceErrorCode.ErrorWithURL_1); errorRecords.Add(wdErr); } else if (pronunciationWWW.url.Equals(wordToPronounce.backupProuounciationURL)) { PronounceErrorRecord wdErr = new PronounceErrorRecord(wordToPronounce.wordId, PronounceErrorCode.ErrorWithURL_2); errorRecords.Add(wdErr); } pronunciationWWW.Dispose(); } } currentConnectingUrl = string.Empty; } }
/// <summary> /// 如果缓存中有单词发音,则直接发音,如果没有,则下载完成后发音 /// </summary> /// <param name="word">Word.</param> public void PronounceWord(HLHWord word) { wordToPronounce = word; // 获取发音缓存 Pronunciation pro = GetPronunciationFromCache(word); // 如果没有缓存数据 if (pro == null) { string pronounceUrl = string.Empty; PronounceErrorRecord errorRecord = CheckPronounceErrorExist(word); if (errorRecord.wordId == -1) { pronounceUrl = word.pronounciationURL; } else if (errorRecord.wordId >= 0) { switch (errorRecord.errorCode) { case PronounceErrorCode.ErrorWithURL_1: pronounceUrl = word.backupProuounciationURL; break; case PronounceErrorCode.ErrorWithURL_2: pronounceUrl = word.pronounciationURL; break; case PronounceErrorCode.Unknown: break; } } // 如果有有效url if (pronounceUrl != string.Empty) { try { // 如果新的url和当前正在请求的url一致时,直接返回【玩家快速多次点击发音按钮,导致多个发音请求时,后面的发音请求直接忽略】 if (string.Equals(pronounceUrl, currentConnectingUrl)) { return; } // 先停止原来发音下载协程【如果上一次发音下载没有完成,传入了新单词的发音请求,则停止前一个发音请求】 CancelInProgressPronounce(); // 等待发音下载完成后发音 waitDownloadFinishCoroutine = PlayPronunciationWhenFinishDownloading(pronounceUrl); StartCoroutine(waitDownloadFinishCoroutine); } catch (System.Exception e) { Debug.Log(e); } } } else { // 如果有缓存发音,则直接发音 GameManager.Instance.soundManager.PlayPronuncitaion(pro.pronunciation, false); } }