93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using UnityEngine;
 | |
| using UnityEngine.Playables;
 | |
| using UnityEngine.Timeline;
 | |
| 
 | |
| namespace UnityEditor.Timeline
 | |
| {
 | |
|     partial class TimelineWindow
 | |
|     {
 | |
|         [SerializeField]
 | |
|         SequencePath m_SequencePath;
 | |
| 
 | |
|         void OnSelectionChange()
 | |
|         {
 | |
|             //Sanitize the inline curve selection
 | |
|             SelectionManager.GetCurrentInlineEditorCurve()?.ValidateCurvesSelection();
 | |
| 
 | |
|             RefreshSelection(false);
 | |
|         }
 | |
| 
 | |
|         void RefreshSelection(bool forceRebuild)
 | |
|         {
 | |
|             // if we're in Locked mode, keep current selection - don't use locked property because the
 | |
|             // sequence hierarchy may need to be rebuilt and it assumes no asset == unlocked
 | |
|             if (m_LockTracker.isLocked || (state != null && state.recording))
 | |
|             {
 | |
|                 RestoreLastSelection(forceRebuild);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             // selection is a TimelineAsset
 | |
|             Object selectedObject = Selection.activeObject as TimelineAsset;
 | |
|             if (selectedObject != null)
 | |
|             {
 | |
|                 SetCurrentSelection(Selection.activeObject);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             // selection is a GameObject, or a prefab with a director
 | |
|             var selectedGO = Selection.activeGameObject;
 | |
|             if (selectedGO != null)
 | |
|             {
 | |
|                 bool isSceneObject = !PrefabUtility.IsPartOfPrefabAsset(selectedGO);
 | |
|                 bool hasDirector = selectedGO.GetComponent<PlayableDirector>() != null;
 | |
|                 if (isSceneObject || hasDirector)
 | |
|                 {
 | |
|                     SetCurrentSelection(selectedGO);
 | |
|                     return;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //If not currently editing a Timeline and the selection is empty, clear selection
 | |
|             if (Selection.activeObject == null &&
 | |
|                 state.IsEditingAnEmptyTimeline())
 | |
|             {
 | |
|                 SetCurrentSelection(null);
 | |
|             }
 | |
| 
 | |
| 
 | |
|             // otherwise, keep the same selection.
 | |
|             RestoreLastSelection(forceRebuild);
 | |
|         }
 | |
| 
 | |
|         void RestoreLastSelection(bool forceRebuild)
 | |
|         {
 | |
|             state.SetCurrentSequencePath(m_SequencePath, forceRebuild);
 | |
| 
 | |
|             //case 1201405 and 1278598: unlock the window if there is no valid asset, since the lock button is disabled
 | |
|             if (m_LockTracker.isLocked && state.editSequence.asset == null)
 | |
|                 m_LockTracker.isLocked = false;
 | |
|         }
 | |
| 
 | |
|         void SetCurrentSelection(Object obj)
 | |
|         {
 | |
|             var selectedGameObject = obj as GameObject;
 | |
|             if (selectedGameObject != null)
 | |
|             {
 | |
|                 PlayableDirector director = TimelineUtility.GetDirectorComponentForGameObject(selectedGameObject);
 | |
|                 SetTimeline(director);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 var selectedSequenceAsset = obj as TimelineAsset;
 | |
|                 if (selectedSequenceAsset != null)
 | |
|                 {
 | |
|                     SetTimeline(selectedSequenceAsset);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             Repaint();
 | |
|         }
 | |
|     }
 | |
| }
 |