48 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| using UnityEngine.Playables;
 | |
| using UnityEngine.Timeline;
 | |
| 
 | |
| namespace Timeline.Samples
 | |
| {
 | |
|     // A track mixer behaviour that modifies the timeScale. This affects how fast the game plays back
 | |
|     public class TimeDilationMixerBehaviour : PlayableBehaviour
 | |
|     {
 | |
|         private float m_DefaultTimeScale = 1;
 | |
| 
 | |
|         // Called every frame that the timeline is Evaluated.
 | |
|         public override void ProcessFrame(Playable playable, FrameData info, object playerData)
 | |
|         {
 | |
|             int inputCount = playable.GetInputCount();
 | |
|             float timeScale = 0f;
 | |
|             float totalWeight = 0f;
 | |
| 
 | |
|             // blend clips together
 | |
|             for (int i = 0; i < inputCount; i++)
 | |
|             {
 | |
|                 float inputWeight = playable.GetInputWeight(i);
 | |
| 
 | |
|                 ScriptPlayable<TimeDilationBehaviour> playableInput = (ScriptPlayable<TimeDilationBehaviour>)playable.GetInput(i);
 | |
|                 TimeDilationBehaviour input = playableInput.GetBehaviour();
 | |
| 
 | |
|                 timeScale += inputWeight * input.timeScale;
 | |
|                 totalWeight += inputWeight;
 | |
|             }
 | |
| 
 | |
|             // blend to/from the default timeline
 | |
|             Time.timeScale = Mathf.Max(0.0001f, Mathf.Lerp(m_DefaultTimeScale, timeScale, Mathf.Clamp01(totalWeight)));
 | |
|         }
 | |
| 
 | |
|         // Called when the playable graph is created, typically when the timeline is played.
 | |
|         public override void OnPlayableCreate(Playable playable)
 | |
|         {
 | |
|             m_DefaultTimeScale = Time.timeScale;
 | |
|         }
 | |
| 
 | |
|         // Called when the playable is destroyed, typically when the timeline stops.
 | |
|         public override void OnPlayableDestroy(Playable playable)
 | |
|         {
 | |
|             Time.timeScale = m_DefaultTimeScale;
 | |
|         }
 | |
|     }
 | |
| }
 |