/// <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); }
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; } } }