Esempio n. 1
0
    void ReverseTime()
    {
        int count = TimeStates.Count;

        // 돌아갈 이벤트가 없으면 취소
        if (count <= 0)
        {
            CancelReverse();
            return;
        }

        float deltaTime = Time.deltaTime;

        TimeState beforeTS = TimeStates[count - 1];



        // loop를 돌며 적정 시간대를 찾아낸다
        while (true)
        {
            // 값이 크면 삭제하면서 다음 위치로
            if (beforeTS.TObjectSt.DeltaTime < deltaTime)
            {
                deltaTime -= beforeTS.TObjectSt.DeltaTime;

                if (count <= 1)
                {
                    count    = 1;
                    beforeTS = TimeStates[0];
                    break;
                }

                TimeStates.RemoveAt(count - 1);   // 삭제
                count--;                          // 다음으로 이동
                beforeTS = TimeStates[count - 1]; // 다음 지정
            }


            // 해당 위치를 찾았을 때
            else if (beforeTS.TObjectSt.DeltaTime >= deltaTime)
            {
                // 보간 사용할 시간 지정
                deltaTime = beforeTS.TObjectSt.DeltaTime - deltaTime;
                if (deltaTime < 0)
                {
                    deltaTime = 0;
                }
                break;
            }
        }

        // 시간대의 이전 시간대를 구해서 보간에 사용
        TimeState dbBeforeTS;

        if (count <= 1)
        {
            dbBeforeTS = beforeTS;
        }

        else
        {
            dbBeforeTS = TimeStates[count - 2];
        }



        // Linear 구하기
        float beforeDeltaTime = beforeTS.TObjectSt.DeltaTime;
        float linear          = 0.0f;

        if (deltaTime > 0)
        {
            linear = deltaTime / beforeDeltaTime;
        }



        /**********************************************************
         *
         * 시간 정보에 Event를 위임해서 사용한다.
         *
         *  - 많은 State들은 각자 Event를 가진다.
         *
         *  - 해당 State 원소에는 각 오브젝트 속성 메서드가 붙어있다.
         *
         * **********************************************************/
        beforeTS.CallReverseTimeEvent(beforeTS, dbBeforeTS, linear, gameObject, components);

        if (OtherReverseTimeEvent != null)
        {
            OtherReverseTimeEvent();
        }

        // 사용 후 지금 위치의 이벤트 삭제
        TimeStates.RemoveAt(count - 1);
    }