Example #1
0
    /// <summary>
    /// 取得目前所有播放中的state的最大剩餘時間
    /// </summary>
    /// <returns></returns>
    private float CalculateQueueTimes()
    {
        float longestTime = -1f;

        for (int i = 0; i < m_States.Count; i++)
        {
            StateInfo state = m_States[i];
            //Skip deleted states
            if (state == null || !state.enabled || !state.playable.IsValid())
            {
                continue;
            }

            if (state.wrapMode == WrapMode.Loop)
            {
                return(Mathf.Infinity);
            }

            float speed     = state.speed;
            float stateTime = m_States.GetStateTime(state.index);
            float remainingTime;
            if (speed > 0)
            {
                remainingTime = (state.clip.length - stateTime) / speed;
            }
            else if (speed < 0)
            {
                remainingTime = (stateTime) / speed;
            }
            else
            {  // speed == 0
                remainingTime = Mathf.Infinity;
            }

            // Maximum
            if (remainingTime > longestTime)
            {
                longestTime = remainingTime;
            }
        }

        return(longestTime);
    }
Example #2
0
    private void UpdateStates(float deltaTime)
    {
        for (int i = 0; i < m_States.Count; i++)
        {
            StateInfo state = m_States[i];

            //Skip deleted states
            if (state == null)
            {
                continue;
            }

            //Update crossfade weight
            if (state.fading)
            {
                state.weight = Mathf.MoveTowards(state.weight, state.targetWeight, state.fadeSpeed * deltaTime);
                if (state.weight == state.targetWeight)
                {
                    state.fadeSpeed = 0f;
                    state.fading    = false;
                }
                state.weightDirty = true;
            }

            if (state.enabledDirty)
            {
                state.playable.SetPlayState(state.enabled ? PlayState.Playing : PlayState.Paused);

                if (!keepStoppedPlayablesConnected)
                {
                    Playable input = m_Mixer.GetInput(i);
                    //if state is disabled but the corresponding input is connected, disconnect it
                    if (input.IsValid() && !state.enabled)
                    {
                        DisconnectInput(i);
                    }
                    else if (state.enabled && !input.IsValid())
                    {
                        ConnectInput(state.index);
                    }
                }
                state.weightDirty  = true;
                state.enabledDirty = false;
            }

            if (state.enabled && state.wrapMode == WrapMode.Once)
            {
                bool  stateIsDone = state.playable.IsDone();
                float speed       = m_States.GetStateSpeed(state.index);
                float time        = m_States.GetStateTime(state.index);
                float duration    = m_States.GetStatePlayableDuration(state.index);

                stateIsDone |= speed < 0f && time < 0f;
                stateIsDone |= speed >= 0f && time >= duration;
                if (stateIsDone)
                {
                    state.weight = 0f;
                    state.time   = 0f;
                    state.playable.SetTime(state.time);
                    state.playable.SetTime(state.time);
                    m_States.DisableState(i);
                    if (!keepStoppedPlayablesConnected)
                    {
                        DisconnectInput(state.index);
                    }
                    state.weightDirty = true;
                }
            }


            if (state.weightDirty)
            {
                m_Mixer.SetInputWeight(state.index, state.weight);
                state.weightDirty = false;
            }
        }
    }