Ejemplo n.º 1
0
    void Update()
    {
        if (Pause)
        {
            return;
        }

        SongInfo song = m_musicManager.currentSongInfo;

        if (m_musicManager.IsPlaying())
        {
            //前帧到现帧之间获得成功的舞台演出
            m_previousIndex = m_seekUnit.nextIndex;

            m_seekUnit.ProceedTime(m_musicManager.DeltaBeatCountFromStart);

            // 开始在“之前的移动位置”和“更新后的移动位置”之间的活动。
            for (int i = m_previousIndex; i < m_seekUnit.nextIndex; i++)
            {
                //复制事件数据
                StagingDirection clone = song.stagingDirectionSequence[i].GetClone() as StagingDirection;
                clone.OnBegin();

                //添加到“执行中的活动列表”
                m_activeEvents.AddLast(clone);
            }
        }

        //“执行中的活动列表”的执行,LinkedList<T>类在.NET framework中是一个双向链表,便于删除
        for (LinkedListNode <StagingDirection> it = m_activeEvents.First; it != null; it = it.Next)
        {
            StagingDirection activeEvent = it.Value;
            activeEvent.Update();

            //执行结束了吗?.
            if (activeEvent.IsFinished())
            {
                activeEvent.OnEnd();

                //从“执行中的事件列表”中删除
                m_activeEvents.Remove(it);
            }
        }
    }
    void Update()
    {
        SongInfo song = m_musicManager.currentSongInfo;

        // 检测到新的事件
        if (m_musicManager.IsPlaying())
        {
            // 保存旧的定位位置
            m_previousIndex = m_seekUnit.nextIndex;

            m_seekUnit.ProceedTime(m_musicManager.beatCount - m_musicManager.previousBeatCount);

            // 开始执行“上次的定位位置”和“更新后的定位位置”之间存在的事件
            for (int i = m_previousIndex; i < m_seekUnit.nextIndex; i++)
            {
                // 拷贝事件数据
                StagingDirection clone = song.stagingDirectionSequence[i].GetClone() as StagingDirection;

                clone.OnBegin();

                // 添加到“执行中的事件列表”
                m_activeEvents.AddLast(clone);
            }
        }

        // 执行“执行中的事件”
        for (LinkedListNode <StagingDirection> it = m_activeEvents.First; it != null; it = it.Next)
        {
            StagingDirection activeEvent = it.Value;

            activeEvent.Update();

            // 执行已经完成?
            if (activeEvent.IsFinished())
            {
                activeEvent.OnEnd();

                // 从“执行中事件列表”中删除
                m_activeEvents.Remove(it);
            }
        }
    }
Ejemplo n.º 3
0
    void Update()
    {
        SongInfo song = m_musicManager.currentSongInfo;

        if (m_musicManager.IsPlaying())
        {
            //前フレームから現フレームへの間にヒットしたステージ演出の取得

            m_previousIndex = m_seekUnit.nextIndex;

            m_seekUnit.ProceedTime(m_musicManager.beatCount - m_musicManager.previousBeatCount);

            // 「直前のシーク位置」と「更新後のシーク位置」の間にあるイベントを実行開始.
            for (int i = m_previousIndex; i < m_seekUnit.nextIndex; i++)
            {
                // イベントデータをコピーする.
                StagingDirection clone = song.stagingDirectionSequence[i].GetClone() as StagingDirection;

                clone.OnBegin();

                // 「実行中のイベントリスト」に追加.
                m_activeEvents.AddLast(clone);
            }
        }

        // 「実行中のイベント」の実行.
        for (LinkedListNode <StagingDirection> it = m_activeEvents.First; it != null; it = it.Next)
        {
            StagingDirection activeEvent = it.Value;

            activeEvent.Update();

            // 実行が終了した?.
            if (activeEvent.IsFinished())
            {
                activeEvent.OnEnd();

                // 「実行中のイベントリスト」から削除する.
                m_activeEvents.Remove(it);
            }
        }
    }
    private void ReadCSV_StagingDirection(System.IO.TextReader reader)
    {
        string line;
        float  totalBeatCount            = 0;
        float  repeatPosition            = 0;
        List <StagingDirection> sequence = new List <StagingDirection>();

        while ((line = reader.ReadLine()) != null)
        {
            string[] lineCells = line.Split(',');
            switch (lineCells[0])
            {
            case "regionParameters":
                totalBeatCount = float.Parse(lineCells[2]);
                repeatPosition = float.Parse(lineCells[3]);
                break;

            case "AllBandMemberDefaultAnimation":
            {
                foreach (GameObject member in GameObject.FindGameObjectsWithTag("BandMember"))
                {
                    StagingDirection_SetBandMemberDefaultAnimation defaultAnimationSet
                        = new StagingDirection_SetBandMemberDefaultAnimation();
                    defaultAnimationSet.triggerBeatTiming    = float.Parse(lineCells[1]);
                    defaultAnimationSet.m_memberName         = member.name;
                    defaultAnimationSet.m_animationFromIndex = int.Parse(lineCells[2]);
                    defaultAnimationSet.m_animationToIndex   = int.Parse(lineCells[3]);
                    sequence.Add(defaultAnimationSet);
                }
            }
            break;

            case "SetAllBandMemberAction":
            {
                foreach (GameObject member in GameObject.FindGameObjectsWithTag("BandMember"))
                {
                    StagingDirection_SetBandMemberAction actionSet = new StagingDirection_SetBandMemberAction();
                    actionSet.triggerBeatTiming = float.Parse(lineCells[1]);
                    actionSet.m_memberName      = member.name;
                    actionSet.m_actionName      = lineCells[2];
                    sequence.Add(actionSet);
                }
            }
            break;

            case "stagingDirectionSequenceRegion-End":
            {
                for (float repeatOffest = 0; repeatOffest < totalBeatCount;)
                {
                    foreach (StagingDirection stagingDirection in sequence)
                    {
                        if (stagingDirection.triggerBeatTiming + repeatOffest > totalBeatCount)
                        {
                            break;
                        }
                        StagingDirection cloned = stagingDirection.GetClone() as StagingDirection;
                        cloned.triggerBeatTiming += m_stagingDirectoionRegionOffset + repeatOffest;
                        songInfo.stagingDirectionSequence.Add(cloned);
                    }
                    repeatOffest += repeatPosition;
                }
                m_stagingDirectoionRegionOffset += totalBeatCount;
            }
                return;

            // ↑已经有 return 所以这个 break 不会被执行
            //break;
            default:
            {
                StagingDirection stagingDirection
                    = StagingDirectionFactory.CreateStagingDirectionFromEnum(
                          (StagingDirectionEnum)System.Enum.Parse(typeof(StagingDirectionEnum), lineCells[0])
                          );
                if (stagingDirection != null)
                {
                    stagingDirection.ReadCustomParameterFromString(lineCells);
                    stagingDirection.triggerBeatTiming = float.Parse(lineCells[1]);
                    sequence.Add(stagingDirection);
                }
            }
            break;
            }
            ;
        }
        Debug.LogError("StagingDirectionSequenceRegion.ReadCSV: ParseError - missing stagingDirectionSequenceRegion-End");
    }
Ejemplo n.º 5
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="reader"></param>
    private void ReadCSV_StagingDirection(System.IO.TextReader reader)
    {
        string line;
        float  totalBeatCount            = 0;
        float  repeatPosition            = 0;
        List <StagingDirection> sequence = new List <StagingDirection>();

        while ((line = reader.ReadLine()) != null)
        {
            string[] lineCells = line.Split(',');
            switch (lineCells[0])
            {
            case "regionParameters":            //-当前区域。第一个参数没用 Ready1。
                //-regionParameters,Intro,32,4
                //-在这个例子中,部分的长度是32拍,重复单位是4拍,所以相同的方向将在32÷4总共重复8次。
                totalBeatCount = float.Parse(lineCells[2]); //-这个区间有多少拍
                repeatPosition = float.Parse(lineCells[3]); //-重复拍子
                break;

            case "AllBandMemberDefaultAnimation":            //-全部乐手一起设置默认动画
            {
                foreach (GameObject member in GameObject.FindGameObjectsWithTag("BandMember"))
                {
                    StagingDirection_SetBandMemberDefaultAnimation defaultAnimationSet
                        = new StagingDirection_SetBandMemberDefaultAnimation();
                    defaultAnimationSet.triggerBeatTiming    = float.Parse(lineCells[1]);  //-时间(节拍数)
                    defaultAnimationSet.m_memberName         = member.name;                //-乐手的名字
                    defaultAnimationSet.m_animationFromIndex = int.Parse(lineCells[2]);    //-动画起始帧
                    defaultAnimationSet.m_animationToIndex   = int.Parse(lineCells[3]);    //-动画结束帧
                    sequence.Add(defaultAnimationSet);
                }
            }
            break;

            case "SetAllBandMemberAction":            //-全部乐手一起播放动画
            {
                foreach (GameObject member in GameObject.FindGameObjectsWithTag("BandMember"))
                {
                    StagingDirection_SetBandMemberAction actionSet = new StagingDirection_SetBandMemberAction();
                    actionSet.triggerBeatTiming = float.Parse(lineCells[1]); //-时间(节拍数)
                    actionSet.m_memberName      = member.name;               //-乐手的名字
                    actionSet.m_actionName      = lineCells[2];              //-动画的名字,actionA,actionB,跳
                    sequence.Add(actionSet);
                }
            }
            break;

            case "stagingDirectionSequenceRegion-End":                                          //-舞台活动结束,返回
            {
                for (float repeatOffest = 0; repeatOffest < totalBeatCount;)                    //-计算要循环几次
                {
                    foreach (StagingDirection stagingDirection in sequence)                     //-变量所有的动作
                    {
                        if (stagingDirection.triggerBeatTiming + repeatOffest > totalBeatCount) //-如果当前动作的执行时间加上循环时间超过区域的总时间,则抛弃这个时间
                        {
                            break;
                        }
                        StagingDirection cloned = stagingDirection.GetClone() as StagingDirection;
                        cloned.triggerBeatTiming += m_stagingDirectoionRegionOffset + repeatOffest;                            //-重新计算出事件真正的触发时间
                        songInfo.stagingDirectionSequence.Add(cloned);
                    }
                    repeatOffest += repeatPosition;
                }
                m_stagingDirectoionRegionOffset += totalBeatCount;
            }
                return;

            // 因为↑有return,所以这个break不被执行.
            //break;

            default://-其他非全体成员的动作通过工厂类创建自动初始化
            {
                StagingDirection stagingDirection
                    = StagingDirectionFactory.CreateStagingDirectionFromEnum(
                          (StagingDirectionEnum)System.Enum.Parse(typeof(StagingDirectionEnum), lineCells[0]));
                if (stagingDirection != null)
                {
                    stagingDirection.ReadCustomParameterFromString(lineCells);
                    stagingDirection.triggerBeatTiming = float.Parse(lineCells[1]);                        //-通用的在第几拍
                    sequence.Add(stagingDirection);
                }
            }
            break;
            }
            ;
        }
        Debug.LogError("StagingDirectionSequenceRegion.ReadCSV: ParseError - missing stagingDirectionSequenceRegion-End");
    }