public static TimelineClip CreateClipOnTrack(Type playableAssetType, Object assignableObject, TrackAsset parentTrack, double candidateTime, WindowState state) { if (parentTrack == null) { return(null); } bool revertClipMode = false; // Ideally this is done automatically by the animation track, // but it's editor only because it does animation clip manipulation var animTrack = parentTrack as AnimationTrack; if (animTrack != null && animTrack.CanConvertToClipMode()) { animTrack.ConvertToClipMode(); revertClipMode = true; } TimelineClip newClip = null; if (TypeUtility.IsConcretePlayableAsset(playableAssetType)) { try { newClip = parentTrack.CreateClipOfType(playableAssetType); } catch (InvalidOperationException) {} // expected on a mismatch } if (newClip == null) { if (revertClipMode) { animTrack.ConvertFromClipMode(animTrack.timelineAsset); } Debug.LogWarningFormat("Cannot create a clip of type {0} on a track of type {1}", playableAssetType.Name, parentTrack.GetType().Name); return(null); } AddClipOnTrack(newClip, parentTrack, candidateTime, assignableObject, state); return(newClip); }