72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using UnityEngine.Playables; | ||
|  | 
 | ||
|  | namespace UnityEngine.Timeline | ||
|  | { | ||
|  |     class ActivationMixerPlayable : PlayableBehaviour | ||
|  |     { | ||
|  |         ActivationTrack.PostPlaybackState m_PostPlaybackState; | ||
|  |         bool m_BoundGameObjectInitialStateIsActive; | ||
|  | 
 | ||
|  |         private GameObject m_BoundGameObject; | ||
|  | 
 | ||
|  | 
 | ||
|  |         public static ScriptPlayable<ActivationMixerPlayable> Create(PlayableGraph graph, int inputCount) | ||
|  |         { | ||
|  |             return ScriptPlayable<ActivationMixerPlayable>.Create(graph, inputCount); | ||
|  |         } | ||
|  | 
 | ||
|  |         public ActivationTrack.PostPlaybackState postPlaybackState | ||
|  |         { | ||
|  |             get { return m_PostPlaybackState; } | ||
|  |             set { m_PostPlaybackState = value; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void OnPlayableDestroy(Playable playable) | ||
|  |         { | ||
|  |             if (m_BoundGameObject == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             switch (m_PostPlaybackState) | ||
|  |             { | ||
|  |                 case ActivationTrack.PostPlaybackState.Active: | ||
|  |                     m_BoundGameObject.SetActive(true); | ||
|  |                     break; | ||
|  |                 case ActivationTrack.PostPlaybackState.Inactive: | ||
|  |                     m_BoundGameObject.SetActive(false); | ||
|  |                     break; | ||
|  |                 case ActivationTrack.PostPlaybackState.Revert: | ||
|  |                     m_BoundGameObject.SetActive(m_BoundGameObjectInitialStateIsActive); | ||
|  |                     break; | ||
|  |                 case ActivationTrack.PostPlaybackState.LeaveAsIs: | ||
|  |                 default: | ||
|  |                     break; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void ProcessFrame(Playable playable, FrameData info, object playerData) | ||
|  |         { | ||
|  |             if (m_BoundGameObject == null) | ||
|  |             { | ||
|  |                 m_BoundGameObject = playerData as GameObject; | ||
|  |                 m_BoundGameObjectInitialStateIsActive = m_BoundGameObject != null && m_BoundGameObject.activeSelf; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (m_BoundGameObject == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             int inputCount = playable.GetInputCount(); | ||
|  |             bool hasInput = false; | ||
|  |             for (int i = 0; i < inputCount; i++) | ||
|  |             { | ||
|  |                 if (playable.GetInputWeight(i) > 0) | ||
|  |                 { | ||
|  |                     hasInput = true; | ||
|  |                     break; | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             m_BoundGameObject.SetActive(hasInput); | ||
|  |         } | ||
|  |     } | ||
|  | } |