/// <summary> /// Shared code for adding a clip to a track /// </summary> static void AddClipOnTrack(TimelineClip newClip, TrackAsset parentTrack, double candidateTime, Object assignableObject, WindowState state) { var playableAsset = newClip.asset as IPlayableAsset; newClip.parentTrack = null; newClip.timeScale = 1.0; newClip.mixInCurve = AnimationCurve.EaseInOut(0, 0, 1, 1); newClip.mixOutCurve = AnimationCurve.EaseInOut(0, 1, 1, 0); var playableDirector = state != null ? state.editSequence.director : null; if (assignableObject != null) { foreach (var field in ObjectReferenceField.FindObjectReferences(playableAsset.GetType())) { if (field.IsAssignable(assignableObject)) { newClip.displayName = assignableObject.name; field.Assign(newClip.asset as PlayableAsset, assignableObject, playableDirector); break; } } } // get the clip editor try { CustomTimelineEditorCache.GetClipEditor(newClip).OnCreate(newClip, parentTrack, null); } catch (Exception e) { Debug.LogException(e); } // reset the duration as the newly assigned values may have changed the default if (playableAsset != null) { var candidateDuration = playableAsset.duration; if (!double.IsInfinity(candidateDuration) && candidateDuration > 0) { newClip.duration = Math.Min(Math.Max(candidateDuration, TimelineClip.kMinDuration), TimelineClip.kMaxTimeValue); } } var newClipsByTracks = new[] { new ItemsPerTrack(parentTrack, new[] { newClip.ToItem() }) }; FinalizeInsertItemsUsingCurrentEditMode(state, newClipsByTracks, candidateTime); if (state != null) { state.Refresh(); } }