public static TimelineAsset CloneTrackAsset(this TimelineAsset self, string trackName) { string path = self.GetAssetPath(); TimelineAsset clone = ScriptableObject.CreateInstance <TimelineAsset>(); foreach (var outputTrack in self.GetOutputTracks()) { if (outputTrack.name.Equals(trackName)) { // TrackAsset cloneTrackAsset= clone.CreateTrack(outputTrack.GetType(), null, outputTrack.name); // string animClipName = "animClip"; // cloneTrackAsset.SetPropertyValue(animClipName, outputTrack.GetPropertyValue<AnimationClip>(animClipName)); // // foreach (var clip in outputTrack.GetClips()) // { // TimelineClip cloneClip= cloneTrackAsset.CreateDefaultClip(); // foreach (var fieldInfo in clone.GetType().GetFields()) // { // cloneClip.SetFieldValue(fieldInfo.Name, clip.GetFieldValue(fieldInfo.Name)); // cloneClip.parentTrack = cloneTrackAsset; // } // } TrackAsset cloneTrackAsset = clone.CreateTrack(outputTrack.GetType(), null, outputTrack.name); foreach (var info in outputTrack.GetType().GetProperties()) { if (info.GetSetMethod(true) != null || info.GetSetMethod() != null) { cloneTrackAsset.SetPropertyValue(info.Name, outputTrack.GetPropertyValue(info.Name)); } } string animClipName = StringConst.String_animClip; cloneTrackAsset.SetPropertyValue(animClipName, outputTrack.GetPropertyValue <AnimationClip>(animClipName)); } } return(clone); }