Example #1
0
    /// <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;
        }
    }
Example #2
0
    /// <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);
        }
    }
Example #3
0
    /// <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);
    }