/// <summary> /// Create a clip on track from an existing PlayableAsset /// </summary> public static TimelineClip CreateClipOnTrackFromPlayableAsset(IPlayableAsset asset, TrackAsset parentTrack, double candidateTime) { if (parentTrack == null || asset == null || !TypeUtility.IsConcretePlayableAsset(asset.GetType())) { return(null); } TimelineClip newClip = null; try { newClip = parentTrack.CreateClipFromPlayableAsset(asset); } catch { return(null); } WindowState state = null; if (TimelineWindow.instance != null) { state = TimelineWindow.instance.state; } AddClipOnTrack(newClip, parentTrack, candidateTime, null, state); return(newClip); }
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); }