/// <summary> /// 控制歌词面板的显示 /// 1. 仅仅显示歌词面板信息 , 没有过渡效果! /// </summary> /// <param name="row">歌词正文部分行号.</param> /// <param name="isPanelView">If set to <c>true</c> 显示面板歌词</param> public void LyricPanelControllerView(KSC.KscWord curRowInfo, bool isPanelView) { // Debug.Log ("当前行是否开始=====>" + isPanelView.ToString ()); _textLogMessage.text = isStartLyricEffectTransition.ToString(); rectBackLyricMask.sizeDelta = new Vector2(0f, rectFrontLyricText.sizeDelta.y); rectBackLyricMask.GetComponentInChildren <Text> ().text = _lyricText.text = ""; if (isPanelView) { //根据时间得到当前播放的是第i行的歌词 //处理歌词面板信息 , 显示歌词 foreach (var item in curRowInfo.PerLineLyrics) { _lyricText.text += item; rectBackLyricMask.GetComponentInChildren <Text> ().text = _lyricText.text; } StartCoroutine(LyricPanelControllerEffect(curRowInfo, isPanelView)); } else { StopAllCoroutines(); rectBackLyricMask.sizeDelta = new Vector2(0f, rectFrontLyricText.sizeDelta.y); // StartCoroutine (LyricPanelControllerEffect (curRowInfo, isPanelView)); //当前歌词结束以后将歌词框初始化成0 rectBackLyricMask.GetComponentInChildren <Text> ().text = _lyricText.text = string.Empty; } }
/// <summary> /// 开始实现歌此过渡效果, 仅仅效果实现 /// 1. 使用Dotween的doSizedata实现 /// 2. 动态调整蒙板的sizedata宽度 /// 3. 根据歌曲当前播放的时间进度进行调整 /// </summary> /// <returns>The panel controller effect.</returns> /// <param name="isPanelEffect">If set to <c>true</c> is panel effect.</param> public IEnumerator LyricPanelControllerEffect(KSC.KscWord curRowInfo, bool isPanelEffect) { //当前时间歌词播放进度的百分比比例 int curWordIndex = 0; if (isPanelEffect) { rectBackLyricMask.DORewind(); yield return(null); rectBackLyricMask.sizeDelta = new Vector2(0f, rectFrontLyricText.sizeDelta.y); //开始效果过渡 if (audioSource.isPlaying) { for (int i = 0; i < curKscword.PerLinePerLyricTime.Length; i++) { rectBackLyricMask.DOSizeDelta( new Vector2(((float)(i + 1) / curKscword.PerLinePerLyricTime.Length) * rectFrontLyricText.sizeDelta.x, rectFrontLyricText.sizeDelta.y) , curKscword.PerLinePerLyricTime [i] / 1000f , false).SetEase(Ease.Linear); // Debug.Log ("第" + i + "个歌词时间"); yield return(new WaitForSeconds(curKscword.PerLinePerLyricTime [i] / 1000f)); } } else { Debug.LogError("歌曲没有播放 !!!!"); } } else { yield return(null); rectBackLyricMask.DOSizeDelta(new Vector2(0f, rectFrontLyricText.sizeDelta.y), 0f, true); } }
/// <summary> /// 获得歌词信息 /// </summary> /// <param name="LrcPath">歌词路径</param> /// <returns>返回歌词信息(Lrc实例)</returns> public static KSC InitKsc(string LrcPath) { int row = 0; //KscWord对象 //清除之前的歌曲歌词, 保持当前 KSC.Instance.Add.Clear(); using (FileStream fs = new FileStream(LrcPath, FileMode.Open, FileAccess.Read, FileShare.Read)) { string line = string.Empty; using (StreamReader sr = new StreamReader(fs, Encoding.Default)) { while ((line = sr.ReadLine()) != null) { //每次循环新建一个对象用于存储不同行数内容 KSC.KscWord kscWord = new KSC.KscWord(); #region ######################################合唱歌曲格式 if (line.StartsWith("karaoke.songname := '")) { Instance.SongName = SplitStrInfo(line); } else if (line.StartsWith("karaoke.internalnumber := ")) { if (SplitIntInfo(line) != 0) { Instance.InternalNumber = SplitIntInfo(line); } } else if (line.StartsWith("karaoke.singer := '")) { Instance.Singer = SplitStrInfo(line); } else if (line.StartsWith("karaoke.wordcount := ")) { if (SplitIntInfo(line) != 0) { Instance.WordCount = SplitIntInfo(line); } } else if (line.StartsWith("karaoke.pinyin := '")) { Instance.Pinyin = SplitStrInfo(line); } else if (line.StartsWith("karaoke.langclass := '")) { Instance.LangClass = SplitStrInfo(line); } else if (line.StartsWith("karaoke.songclass := '")) { Instance.SongClass = SplitStrInfo(line); } else if (line.StartsWith("karaoke.songstyle := '")) { Instance.SongStyle = SplitStrInfo(line); } else if (line.StartsWith("karaoke.videofilename :='")) { Instance.VideoFileName = SplitStrInfo(line); } else if (line.StartsWith("mcolor :=rgb(")) { if (SplitColorInfo(line) != Color.clear) { Instance.Mcolor = SplitColorInfo(line); } } else if (line.StartsWith("wcolor :=rgb(")) { if (SplitColorInfo(line) != Color.clear) { Instance.Wcolor = SplitColorInfo(line); } #endregion #region ##################################################独唱歌曲风格 } else if (line.StartsWith("karaoke.tag('")) { //获取tag标签的参数信息 KSC.Instance.listTags.Add(SplitTagInfo(line)); #endregion #region ################################################歌词正文部分解析 } else if (line.StartsWith(("karaoke.add"))) //表示歌词正文部分 { if (SplitLyricStartTime(line) != null) { //行号 ( 从0行开始 ) //获取每句歌词部分的开始时间 kscWord.PerLineLyricStartTimer = SplitLyricStartTime(line); //获取每句歌词部分的结束时间 kscWord.PerLintLyricEndTimer = SplitLyricEndTime(line); //获取每行歌词的内容,并存储到KSCWord中 ( 歌词文字的数组信息 左 → 右 ) kscWord.PerLineLyrics = SplitPerLineLyrics(line); //获取每行中单个文字的过渡时间数组 ( 歌词文字过渡时间数组 左 → 右 ) kscWord.PerLinePerLyricTime = SplitPerLinePerLyricTime(line); KSC.Instance.Add.Add(row, kscWord); row++; } } else { //忽略ksc文件中的其他部分 if (line != "" && !line.Contains("CreateKaraokeObject") && !line.Contains("karaoke.rows") && !line.Contains("karaoke.clear;") && !Regex.IsMatch(line, @"^\//")) { Debug.LogWarning("歌词含有不能解析的部分 ===> " + line); } } #endregion } } } Debug.Log("LyricFileInitialized" + " Path : \n" + LrcPath); return(Instance); }