using UnityEngine; using UnityEngine.Playables; using UnityEngine.Timeline; namespace uc.Timeline { public sealed class MoviePlayerMixer : PlayableBehaviour { public override void OnBehaviourPlay(Playable playable, FrameData info) { //Debug.Log("MoviePlayerMixer OnBehaviourPlay"); base.OnBehaviourPlay(playable, info); } public override void OnBehaviourPause(Playable playable, FrameData info) { //Debug.Log("MoviePlayerMixer OnBehaviourPause"); base.OnBehaviourPlay(playable, info); } public override void ProcessFrame(Playable playable, FrameData info, object playerData) { base.ProcessFrame(playable, info, playerData); // Get the brain that this track controls. // Older versions of timeline sent the gameObject by mistake. GameObject go = playerData as GameObject; MoviePlayerBase movie = (go == null) ? (MoviePlayerBase)playerData : go.GetComponent(); if (movie == null) return; //Debug.Log("MoviePlayerMixer ProcessFrame"); //Debug.Log(movie.gameObject.name); bool should_play = false; bool should_pause = true; double time = -1; //Debug.Log("play state: " + playable.GetPlayState()); //Debug.Log("input states: "); for (int i = 0; i < playable.GetInputCount(); ++i) { Playable playerPlayable = playable.GetInput(i); //Debug.Log(playerPlayable.GetPlayState()); float weight = playable.GetInputWeight(i); if (playable.GetPlayState() == PlayState.Playing && weight > 0.0001f) { if(playerPlayable.GetPlayState() == PlayState.Playing) { should_play = true; should_pause = false; time = playerPlayable.GetTime(); //Debug.Log(time); } } //Debug.Log(i + " " + playerPlayable.GetPlayState()); } bool should_update_frame = time >= 0; should_pause |= info.deltaTime == 0; //Debug.Log(""); //Debug.Log(info.evaluationType); //Debug.Log(info.seekOccurred); //Debug.Log(info.timeHeld); /* if (info.evaluationType == FrameData.EvaluationType.Evaluate && should_update_frame) { should_play = true; should_pause = true; } */ if (should_play && movie.IsPlaying == false) { movie.Play(); } if(should_update_frame) { uint target_frame = (uint)(movie.TotalNumFrames * time / movie.GetDuration); int frame_dist = (int)target_frame - (int)movie.Frame; if (Mathf.Abs(frame_dist) >= 2) { movie.Frame = target_frame; } } if(should_pause && movie.IsPaused == false) { movie.Pause(); } } } }